Hallo!
Atmega8, interner Takt, PortD. Hier nimmt unsere Geschichte ihren eigenartigen Verlauf. Die Mission schien einfach: Lasse LEDS an dem Port der Reihe nach leuchten (auch Lauflicht genannt), um die einzelnen Pins zu überprüfen. Unser Programmierer schrieb daraufhin folgendes (unsauberes) Programm:
Code:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portd = Output
Schleife:
Portd = 00000001
Wait 1
Portd = 00000010
Wait 1
Portd = 00000100
Wait 1
Portd = 00001000
Wait 1
Portd = 00010000
Wait 1
Portd = 00100000
Wait 1
Portd = 01000000
Wait 1
Portd = 10000000
Wait 1
goto Schleife
Es passierte jedoch erstaunliches. Das folgende Protokoll verdeutlicht noch einmal die dunklen Machenschaften von Port D:
Code:
Pin-Nr.:
76543210
LEDs:
00000001
00001010
01100100
11101000
00010000
10100000
01000000
10000000
Unser Programmierer war geschockt, gab jedoch nicht auf und dem ROTATE-Befehl eine Chance. Schließlich macht dieser dasselbe. Neuer Code, neues Glück:
Code:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portd = Output
Dim A As Byte
Schleife:
Let A = 1
Portd = A
Rotate A , Left , 1
Wait 1
Portd = A
Rotate A , Left , 1
Wait 1
Portd = A
Rotate A , Left , 1
Wait 1
Portd = A
Rotate A , Left , 1
Wait 1
Portd = A
Rotate A , Left , 1
Wait 1
Portd = A
Rotate A , Left , 1
Wait 1
Portd = A
Rotate A , Left , 1
Wait 1
Portd = A
Rotate A , Left , 1
Wait 1
Goto Schleife
Siehe da: PORT D war bezwungen. Das Lauflicht funktionierte wie beabsichtigt. Der Programmierer fragt sich dennoch, warum der erste Versuch fehlschlug. Könnt ihr ihm helfen?
Lesezeichen