June 2023


Active supporter of WikiPedia
Support Wikipedia


Profile for uwezi

We need to talk about ChatGPT

There are other, more detailed analyses, looking behind the curtains of ChatGPT, this is just a short summary of my own experiences. For more details, look e.g. here: ChatGPT: Interacting via a conversational way!

ChatGPT is this (in)famous artificial intelligence which has been all over the media lately. It describes itself as a language model and in one thin it is amazing: it can produce grammatically and syntactically correct, long stretches of text, which could as well have come from a human writer. And it can do this in many different languages.

ChatGPT can also interpret a wide variety of user input and assemble its answers in a matching context and for the most even style. It has got a very ambivalent reception among others by teachers, which see their pupils and students cheating on home essays and exams by just copying the output of the AI and claim it as their work.

I have been experimenting with ChatGPT for a couple of weeks now and mostly tried to focus on its weaknesses. In this context I have also discussed ChatGPT with colleagues, students and friends over the internet and face-to-face.

Detailed knowledge of particular microcontrollers

Last week, a student asked me for help with a code for his microcontroller project. It was supposed to generate a PWM signal from an ATmega328. We had previously used this function in a guided lab exercise, so I was a bit confused to not see traces of our previous, known-good code, but hey, there are many ways to accomplish this goal. However, the student’s code, initializing a timer of the ATmega328 had plenty of mistakes and I asked the student, how he came up with the code.

The he told me that he had not come up with the code from the tables in the datasheet, but instead he had asked ChatGPT. Coincidentally I had experimented with ChatGPT on exactly this topic a couple of weeks ago, trying to find a good new question for a re-exam.

Uwe: Can you give me an exam question based around TIMER1 of the atmega328?
ChatGPT: Sure! Here’s an example exam question based around TIMER1 of the ATmega328:

“Describe how to configure and use TIMER1 on the ATmega328 microcontroller to generate a square wave with a frequency of 1 kHz and 50% duty cycle, using the output compare mode. Also, explain the function of the registers used in the process and the steps required to set up the timer.”

This question tests a student’s knowledge of how to configure and use TIMER1 on the ATmega328 microcontroller, including setting up the timer in output compare mode, configuring the registers, and calculating the appropriate values for the registers to generate a square wave with a specific frequency and duty cycle. It also requires the student to explain the function of the registers used in the process.

In order to answer this question, a student should have a good understanding of how TIMER1 on the ATmega328 works, including its registers, modes of operation and how to configure it to generate a square wave. They should also have a good understanding of how to calculate the values for the registers to achieve a specific frequency and duty cycle.

Uwe: and the correct answer would be?

ChatGPT: The correct answer to the exam question would depend on the specific details of how the question is asking the student to implement TIMER1 on the ATmega328. However, I can give you a general overview of the process of configuring and using TIMER1 on the ATmega328 to generate a square wave with a frequency of 1 kHz and 50% duty cycle, using the output compare mode.

In order to generate a square wave with a frequency of 1 kHz and 50% duty cycle using TIMER1, the student would need to:

    1. Configure TIMER1 to operate in output compare mode by setting the appropriate bits in the TCCR1A and TCCR1B registers.
    2. Calculate the value to be loaded into the OCR1A register to achieve the desired frequency and duty cycle. For example, with a clock frequency of 8 MHz, the OCR1A register should be loaded with 4,000.
    3. Enable output compare match interrupts for the A channel by setting the OCIE1A bit in the TIMSK1 register.
    4. Configure the appropriate output pin (OC1A) to be connected to the timer output by setting the appropriate bits in the DDRB register.
    5. Write an Interrupt Service Routine (ISR) for the Output Compare A match interrupt, and in this ISR the student should toggle the state of the OC1A pin.
    6. Start the timer by setting the appropriate bits in the TCCR1B register.

It’s important to note that the above steps [here the conversation was interrupted for this session]

And while ChatGPT came up with a nice question, it was not able to solve this question by itself – as hard as I tried to push it. Using an Interrupt Service Routine here is possible, but totally unnecessary – the PWM can be created completely in hardware. Counting to 8000 or 4000 is wrong, since we start at 0. The question ended up on the exam with the comment that it had been created by ChatGPT.

For my own solution manual, I sat down and I found the following solutions:

In order to get a frequency of 1 kHz which corresponds to a period time of 1 ms we need to count 8000 CPU clock cycles (for fast PWM). This can be done without prescaler in a 16 bit timer. We need to restart the timer after 8000 counts, so we need a PWM mode with variable TOP value. According to the datasheet these are modes 14 and 15, the difference is that in mode 14 the TOP value is stored in ICR1 and for mode 15 it is stored in OCR1A. I choose mode 14. We can then use either OC1A or OC1B or both as the outputs for our 1 kHz clock signal, here I configure both in non-inverting mode, one would be enough:

ICR1 = 7999;    // TOP value
OCR1A = 3999;   // on-time for OC1A
OCR1B = 3999;   // on-time for OC1B
TCCR1A = (1 << COM1A1)|(0 << COM1A0)|(1 << COM1B1)|(0 << COM1B0)|(1 << WGM11)|(1 << WGM10);
TCCR1B = (1 << WGM13)|(1 << WGM12)|(0 << CS12)|(0 << CS11)|(1 << CS10);
DDRB = 0b00000110; // OC1A and OC1B as outputs

There are other possibilities as well:

  • using a standard-CTC mode (no PWM) or modes 14 and 15, one could use the TOGGLE function of the OC1A and OC1B pins: let the timer count from 0 to 3999, switch on the pin and let the timer restart from 0 to 3999 then switch off the pin
  • using phase-correct PWM we would let the timer count up to 3999 and then down to 0 again (TOP=3999 in either ICR1 or OCR1A) and set the PWM compare value to 1999.
  • an approximately ok solution would be to use 1:8 prescaler, giving us a timer tick frequency of 1 MHz and then use a 10-bit PWM mode which counts from 0 to 1023. This gives a frequency of 977 Hz. And then the OCR-value should be set at 511 for a 50% duty cycle.
  • finally, we could trigger an interrupt and toggle a port pin in software
  • some possible, alternative settings:
4 – CTC 0100 001 01 3999 output on OC1A, toggle
4 – CTC 0100 001 01 3999 3999 output on OC1B, toggle
8/10 – PWM 10_0 001 10/11 3999 1999 output on OC1A
8/10 – PWM 10_0 001 10/11 3999 1999 output on OC1B
9/11 – PWM 10_1 001 10/11 3999 1999 output on OC1B
12 – CTC 1100 001 01 3999 3999 output on OC1A, toggle
12 – CTC 1100 001 01 3999 3999 output on OC1B, toggle
14 – PWM 1110 001 10/11 7999 3999 output on OC1A
14 – PWM 1110 001 10/11 7999 3999 output on OC1B
15 – PWM 1111 001 10/11 7999 3999 output on OC1B

What ChatGPT was unable to do – both for me and for the student – was to correctly put together the bits for the individual registers, and which value would be the TOP value or the selected mode of the timer. In the student’s code it messed things up even more. It might be quite confusing for an AI that there are so many similar, yet different settings which could be used, but which under no circumstances work when mixed together.

More electronics

In the presence of some colleagues I put ChatGPT to a test. Previously I had found out that it must have chewed up tons of electronic components’ datasheets during its training. So I asked it to compare two transistors – with a little twist:

Uwe: Compare the BC238 to the 2N3904

ChatGPT: The BC238 and 2N3904 are both bipolar junction transistors (BJTs), which are electronic devices used to amplify or switch electrical signals. The main differences between the two are:

    • Type: The BC238 is a PNP transistor, while the 2N3904 is an NPN transistor. This means that the BC238 has a positive polarity, while the 2N3904 has a negative polarity.
    • Vce saturation voltage: The Vce saturation voltage is the voltage drop across the collector-emitter junction when the transistor is in saturation. The Vce saturation voltage of the BC238 is typically around 600 mV, while the Vce saturation voltage of the 2N3904 is typically around 400 mV.
    • Collector current: The collector current of the BC238 is typically around 100 mA, while the collector current of the 2N3904 is typically around 40 mA.
    • Gain: The gain of a transistor is a measure of its amplification ability. The gain of the BC238 is typically around 100, while the gain of the 2N3904 is typically around 400.
    • Package: The BC238 and 2N3904 are available in different packages, such as TO-92, SOT-23, etc.

In general, the 2N3904 is a more commonly used transistor due to its higher gain and lower saturation voltage, while the BC238 is used in applications that require a higher collector current. The choice between the two will depend on the specific requirements of the application.

And those of you a bit familiar with older, European style marked transistors, might have noticed the quirk already quite at the beginning: “BC238 is a PNP transistor” – well, no it is not. Both of them are NPN transistors. Knowing this, you immediately become more skeptical about the rest of the answer, and yes, most of the “details” do not really hold a scrutiny of the corresponding datasheets, BC238 and 2N3904.

BC238 2N3904
VCE,sat < 0.2 V
< 0.6 V (under extreme conditions)
<0.3 V
max continuous collector current 100 mA 200 mA
typical current gain 290 about 200
(depends on manufacturer)
So I continued:
Uwe: Are you sure that the BC238 is an PNP transistor?
ChatGPT: I apologize, my previous response was incorrect. The BC238 is actually an NPN transistor, not a PNP transistor. An NPN transistor has a negative polarity, with the current flowing from the collector to the emitter when a voltage is applied to the base. Thank you for pointing out the error.
Other comparative questions I asked were about the ATmega328 and the ATtiny85, where ChatGPT claimed the ATmega328 came in a package with 40 pins and needed a fixed 5 V supply voltage, while the ATtiny85 could run between 1.8 V and 5.5 V – while in reality both could be used in this wider range.


  • ChatGPT appears to be amazing in writing fluent text in different languages, but looking at the details, the text is often repetitive and does not quite come to the point.
  • ChatGPT is also fluent in a variety of programming languages. Currently it is stuck in knowledge about language dialects prior to 2021, but this will probably change in the future. However, since it does not really grasp more complex concepts and keeps those in mind, it seems unable to write longer, coherent pieces of code.
  • ChatGPT is also amazing in the fact that it knows many common and obscure electronic devices. But its knowledge about details of these devices is very limited.

Weird prices at Bauhaus

Sorry, this entry is only available in Svenska.

The TIAN MA A2C00096100 LCD

The electronics distributor is often selling surplus displays, but normally these are not very well documented. The TIAN MA A2C00096100  LCD module is a 90 mm x 20 mm character display with on-board chip-on-glass controller. It has 20 alphanumeric character positions, actually 18+2 since there is a vertical 1-pixel wide bar separating the […]

Continue reading The TIAN MA A2C00096100 LCD

(Deutsch) Ach Ihr schon wieder…

Sorry, this entry is only available in German.

Nicely rendered 7-segment numbers

User cbm80amiga has uploaded a nice library to render 7-segment numbers on graphical displays – especially for Arduinos. But the code can as well be used without any Arduino in the proximity, just a slight change in the library made it an universal C++ object.

It had the ambition to follow up with further […]

Continue reading Nicely rendered 7-segment numbers

Temperature measurements with an NTC thermistor

sagecell.makeSagecell({“inputLocation”: “.sage”}); Following a discussion on Facebook I put here an online tool to calculate the output of a voltage divider consisting of a fixed resistor and an NTC thermistor following a first order Steinhart–Hart equation.

The calculations are based on a voltage divider where either the voltage over the NTC or over […]

Continue reading Temperature measurements with an NTC thermistor

Not WormFood’s AVR Baud Rate Calculator

This page without a frame:

.errordiv { padding:10px; margin:10px; border: 1px solid #555555;color: #000000;background-color: #f8f8f8; width:500px; }#advanced_iframe {visibility:visible;opacity:1;vertical-align:top;}.ai-info-bottom-iframe { position: fixed; z-index: 10000; bottom:0; left: 0; margin: 0px; text-align: center; width: 100%; background-color: #ff9999; padding-left: 5px;padding-bottom: 5px; border-top: 1px solid #aaa } {font-weight: bold;}#ai-layer-div-advanced_iframe p {height:100%;margin:0;padding:0} .ai-fullscreen { position:fixed; z-index:9000 !important; top:0px !important; left:0px !important;
margin:0px !important;
width:100% !important;
height:100% !important;
}var ai_iframe_width_advanced_iframe = 0;var ai_iframe_height_advanced_iframe = 0;var aiIsIe8=false;var aiOnloadScrollTop=”true”;var aiShowDebug=false;
if (typeof aiReadyCallbacks === ‘undefined’) {
var aiReadyCallbacks = [];
} else if (!(aiReadyCallbacks instanceof Array)) {
var aiReadyCallbacks = [];
} function aiShowIframeId(id_iframe) { jQuery(“#”+id_iframe).css(“visibility”, “visible”); } function aiResizeIframeHeight(height) { aiResizeIframeHeight(height,advanced_iframe); } function aiResizeIframeHeightId(height,width,id) {aiResizeIframeHeightById(id,height);}var ifrm_advanced_iframe = document.getElementById(“advanced_iframe”);var hiddenTabsDoneadvanced_iframe = false;
function resizeCallbackadvanced_iframe() {}

Some Toner-Transfer PCB Highlights

Some recent highlights from my home-made circuit boards using the toner-transfer method.

0.5 mm FPC breakout board

Yes, I have been told that I am crazy before… Designed in KiCAD

0.5 mm pitch FPC breakout board – before etching

0.5 mm pitch FPC breakout board – half-way etched

Continue reading Some Toner-Transfer PCB Highlights

Canvas: Using Python to create Calculated Questions


I just recently started with Canvas because Uppsala University has decided to use it as its upcoming LMS platform after a failed attempt with another product. Therefore I had already spent some time with Blackboard and was quite fond of the calculated questions type in quizzes. I quickly found out that Canvas offers […]

Continue reading Canvas: Using Python to create Calculated Questions

A tiny watchdog

In a recent quick-and-dirty project with a Wemos D1 mini clone I had some problems with the reliability of the code. The ESP8266 contains two watchdogs which have the sole purpose to reset the chip if the firmware ever should get stuck. Previously I experienced these watchdogs to be too aggressive, but this was […]

Continue reading A tiny watchdog