Наверное кое кто из вас слышал о ChatGPT, кто не слышал приведу цитату из википедии :
ChatGPT — чат-бот с искусственным интеллектом, разработанный компанией OpenAI и способный работать в диалоговом режиме, поддерживающий запросы на естественных языках. ChatGPT — большая языковая модель, для тренировки которой использовались методы обучения с учителем и обучения с подкреплением. ChatGPT был запущен 30 ноября 2022 года и привлёк внимание своими широкими возможностями: написание кода, создание текстов, возможности перевода, получения точных ответов и использование контекста диалога для ответов, хотя его фактическая точность и подверглась критике.
И так, получив доступ к боту смотрим,он и правда пишет любой код быстро и без ошибок ?
Первый запрос : Напиши код для регулятора мощности паяльника,используй pic16f877a,оптический энкодер для задания мощности и индикатор 1602 для индикации мощности.
Ответ под спойлером , время ожидания составило около 30 секунд.
Спойлер
Конечно, вот пример кода на Great Cow BASIC для регулятора мощности паяльника на основе микроконтроллера PIC16F877A с использованием оптического энкодера и индикатора 1602:
'Конфигурация микроконтроллера
#chip 16F877A, 8
#config lcd = 16x2
'Инициализация портов ввода-вывода
TRISA = 0b00011111 'RA0-RA4 как входы для оптического энкодера и RA5 как выход для управления тиристором
TRISB = 0 'Устанавливаем порт B как выход
TRISD = 0 'Устанавливаем порт D как выход
'Инициализация дисплея
Lcd_Init()
'Переменные
Dim Power_Level As Byte = 0 'Текущий уровень мощности (0-255)
Dim Encoder_Counter As Byte = 0 'Счетчик оптического энкодера
Dim Encoder_Old_State As Byte = 0 'Предыдущее состояние оптического энкодера
'Основной цикл программы
Do
'Считываем состояние оптического энкодера
Dim Encoder_State As Byte = PORTA And 0b00011111
'Если состояние изменилось, то увеличиваем или уменьшаем уровень мощности
If Encoder_State <> Encoder_Old_State Then
If Encoder_State = 0b00000101 And Encoder_Old_State = 0b00000100 Then 'При повороте вправо
If Power_Level < 255 Then
Power_Level = Power_Level + 1
End If
ElseIf Encoder_State = 0b00000110 And Encoder_Old_State = 0b00000100 Then 'При повороте влево
If Power_Level > 0 Then
Power_Level = Power_Level - 1
End If
End If
Encoder_Old_State = Encoder_State
End If
'Отображаем уровень мощности на дисплее
Lcd_Out(1, 1, "Power level: ")
Lcd_Out(1, 13, NumberToString(Power_Level, 3))
'Устанавливаем уровень мощности на выходе
If Power_Level > 0 Then
PORTAbits.RA5 = 1 'Включаем тиристор
Delay_us(Power_Level) 'Ждем соответствующее время
PORTAbits.RA5 = 0 'Выключаем тиристор
End If
Loop
End
В этом примере мы используем оптический энкодер для управления уровнем мощности паяльника. Мы инициализируем порты A, B и D как входы и выходы, а также инициализируем дисплей 1602 для отображения уровня мощности. Затем мы в основном цикле программы считываем состояние оптического энкодера, изменяем уровень мощности и отображаем его на дисплее. Мы также устанавливаем уровень мощности на выходе, используя тиристор.
Обратите внимание, что для реализации регулятора мощности паяльника вам может потребоваться дополнительная электроника, такая как тиристор, трансформатор, датчик температуры и др.Здесь бот решил писать код на GCB видимо по тому что перед этим я просил его использовать именно GCBasic, не вопрос, уточним просьбу :
Перепиши код на BascomAVR и Atmega8, ответ под спойлером , время генерации около 40 сек.
Спойлер
Конечно, вот пример кода на Bascom-AVR для регулятора мощности паяльника на основе микроконтроллера Atmega8 с использованием оптического энкодера и индикатора 1602:
'Конфигурация микроконтроллера
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
'Инициализация портов ввода-вывода
Config Lcd = 16 * 2
Config Porta = Input
Config Portb = Output
Config Portd = Output
'Инициализация дисплея
Lcdinit
'Переменные
Dim Power_Level As Byte = 0 'Текущий уровень мощности (0-255)
Dim Encoder_Counter As Byte = 0 'Счетчик оптического энкодера
Dim Encoder_Old_State As Byte = 0 'Предыдущее состояние оптического энкодера
'Основной цикл программы
Do
'Считываем состояние оптического энкодера
Dim Encoder_State As Byte = Pinb And %00011111
'Если состояние изменилось, то увеличиваем или уменьшаем уровень мощности
If Encoder_State <> Encoder_Old_State Then
If Encoder_State = %00000101 And Encoder_Old_State = %00000100 Then 'При повороте вправо
If Power_Level < 255 Then
Power_Level = Power_Level + 1
End If
ElseIf Encoder_State = %00000110 And Encoder_Old_State = %00000100 Then 'При повороте влево
If Power_Level > 0 Then
Power_Level = Power_Level - 1
End If
End If
Encoder_Old_State = Encoder_State
End If
'Отображаем уровень мощности на дисплее
Lcdout 1, 1, "Power level: "
Lcdout 1, 13, Dec3 Power_Level
'Устанавливаем уровень мощности на выходе
If Power_Level > 0 Then
Portd.3 = 1 'Включаем тиристор
Delayus Power_Level 'Ждем соответствующее время
Portd.3 = 0 'Выключаем тиристор
End If
Loop
End
В этом примере мы используем оптический энкодер для управления уровнем мощности паяльника. Мы инициализируем порты A, B и D как входы и выходы, а также инициализируем дисплей 1602 для отображения уровня мощности. Затем мы в основном цикле программы считываем состояние оптического энкодера, изменяем уровень мощности и отображаем его на дисплее. Мы также устанавливаем уровень мощности на выходе, используя тиристор.
Обратите внимание, что для реализации регулятора мощности паяльника вам может потребоваться дополнительная электроника, такая как тиристор, трансформатор, датчик температуры и др.И ещё несколько примеров кода :
Алгоритм Брезенхема
Спойлер
Конечно, вот пример реализации алгоритма Брезенхема на Great Cow BASIC для рисования линии между двумя точками (x1, y1) и (x2, y2):
'Конфигурация микроконтроллера
#chip 16F877A, 8
#config osc = HS, wdt = OFF
'Инициализация портов ввода-вывода
TRISB = 0 'Устанавливаем порт B как выход
'Процедура рисования линии по алгоритму Брезенхема
Sub Bresenham(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)
Dim dx As Integer
Dim dy As Integer
Dim sx As Integer
Dim sy As Integer
Dim err As Integer
Dim e2 As Integer
dx = Abs(x2 - x1)
dy = Abs(y2 - y1)
If x1 < x2 Then
sx = 1
Else
sx = -1
End If
If y1 < y2 Then
sy = 1
Else
sy = -1
End If
err = dx - dy
Do
PORTBbits.RB0 = 1 'Устанавливаем логическую единицу на порт B0
Delay_ms(1) 'Ждем 1 миллисекунду
PORTBbits.RB0 = 0 'Устанавливаем логический ноль на порт B0
If x1 = x2 And y1 = y2 Then 'Если достигли конечной точки
Exit Do 'Выходим из цикла
End If
e2 = 2 * err
If e2 > -dy Then
err = err - dy
x1 = x1 + sx
End If
If e2 < dx Then
err = err + dx
y1 = y1 + sy
End If
Loop
End Sub
'Основной цикл программы
Do
Bresenham(0, 0, 10, 10) 'Рисуем линию между точками (0, 0) и (10, 10)
Loop
End
Алгоритм Брезенхема позволяет рисовать линии между двумя точками на экране, используя только целочисленные операции. В этом примере мы определяем процедуру Bresenham, которая принимает координаты начальной и конечной точек линии и рисует линию между ними. Мы используем порт B0 для рисования линии.
В основном цикле программы мы вызываем процедуру Bresenham с координатами начальной точки (0, 0) и конечной точки (10, 10). Линия будет рисоваться бесконечно, потому что мы находимся в бесконечном цикле.Управление DDS AD9850
Спойлер
'Конфигурация микроконтроллера
#chip 16F877A, 8
#config osc = HS, wdt = OFF
'Инициализация портов ввода-вывода
TRISB = %00001100 'Устанавливаем RB2 и RB3 как входы, остальные как выходы
PORTB = 0 'Очищаем порт B
'Инициализация AD9850
Dim Fout As Word 'Частота на выходе AD9850
Dim FreqWord As Word 'Строка частоты для передачи в AD9850
Dim i As Byte 'Переменная для цикла
Sub SendData(Data As Byte) 'Функция для отправки байта данных на AD9850
For i = 0 To 7
If (Data And (1 << i)) > 0 Then 'Проверяем, установлен ли i-й бит
PORTB.0 = 1 'Устанавливаем линию DATA на высокий уровень
Else
PORTB.0 = 0 'Устанавливаем линию DATA на низкий уровень
End If
PORTB.1 = 1 'Устанавливаем линию CLK на высокий уровень
PORTB.1 = 0 'Устанавливаем линию CLK на низкий уровень
Next i
End Sub
Sub SetFreq(Freq As Word) 'Функция для установки частоты на выходе AD9850
Fout = Freq 'Записываем желаемую частоту в переменную Fout
FreqWord = Freq * 6.875 'Вычисляем значение частоты для передачи в AD9850
'Отправляем данные на AD9850
SendData(FreqWord And 0xFF) 'Отправляем младший байт
SendData((FreqWord >>8) And 0xFF) 'Отправляем старший байт
SendData(%00011110) 'Отправляем управляющий байт для выбора режима частоты
SendData(%00000001) 'Отправляем управляющий байт для включения AD9850
End Sub
'Обработчик прерывания для кнопок
Interrupt Int_RB
If PORTB.2 = 0 Then 'Если кнопка на RB2 нажата
Fout = Fout + 100 'Увеличиваем частоту на 100 Гц
ElseIf PORTB.3 = 0 Then 'Если кнопка на RB3 нажата
Fout = Fout - 100 'Уменьшаем частоту на 100 Гц
End If
SetFreq(Fout) 'Устанавливаем новую частоту на выходе AD9850
INTCON.RBIF = 0 'Сбрасываем флаг прерывания
End Interrupt
'Основной цикл программы
Do
Loop
В этом коде используется прерывание INTRB для обработки нажатий кнопок. Когда на портах RB2 и RB3 происходит изменение состояния, прерывание генерируется и вызывается обработчик прерывания IntRB, который проверяет состояние кнопок и изменяет выходную частоту в соответствии с нажатой кнопкой.
Для работы прерываний должны быть установлены соответствующие биты в регистре INTCON, а также настроены соответствующие биты в регистре IOCB для портов RB2 и RB3. Обратите внимание, что прерывания могут сбрасываться, если обработчик не успевает выполниться до следующего прерывания, поэтому важно обеспечить минимальную задержку в обработчике. AHDL делитель на 10:
Спойлер
-- AHDL code for a divide-by-10 circuit
--
-- Inputs:
-- CLK - clock input
-- RST - asynchronous reset input
-- Outputs:
-- Q - divided clock output
-- Register to store the current count
reg [3:0] count_reg;
-- Combinational logic to determine the next count value
always @ (posedge CLK or negedge RST) begin
if (!RST) begin
count_reg <= 4'b0000;
end else begin
if (count_reg == 4'b1001) begin
count_reg <= 4'b0000;
end else begin
count_reg <= count_reg + 1;
end
end
end
-- Output the divided clock signal
assign Q = count_reg[3];
В этом примере мы используем регистр для хранения текущего значения счетчика и комбинационную логику для вычисления следующего значения счетчика. При достижении значения 9 мы обнуляем счетчик и начинаем снова.
Наконец, мы используем выходной сигнал счетчика в качестве деленного сигнала, который будет иметь частоту, в 10 раз меньшую, чем входной сигнал.Время создания любого кода не превышало 40 сек. Но тут надо отметить что иногда бот занят,очень занят и ответ может не придти вовсе,не стесняемся повторить.
Он ошибается и косячит ? Да ! Код для подключения экрана Nokia3310 написал со второго раза ( первый раз код был для индикатора 1602)
Библиотека USB 16F4550 то же не далась не с первого,не с второго раза.
Возможно дело в языке запроса ( у меня все запросы ну RU) или инструкциях для самого бота ( возможны разные варианты поведения и стилей ответа )
НО ! Это чертовски интересно в любом случаи. За несколько итераций ,из нескольких подзадач вполне себе рождается программа на любом языке программирования и для практически любого МК.
PS Увы , но официально ChatGPT в России не доступен,но когда это нас останавливало......
PPS Я не уверен что правильно выбрал раздел, Администрация перенесите если что.