Newbie problems/de
Wenn Sie BASCOM ohne genaue Kenntnis der AVR Architektur benutzen können Sie auf einige Punkte stoßen.
- Ich kann einen Port-Pin nicht auf High oder Low setzen
- Ich kann nicht von einem Eingabe-Pin einlesen
Ein AVR Mikrocontroller hat drei Register für jeden Port. Ein Port besteht normalerweise aus 8 Pins. Ein Port trägt die Beizeichnung A-F. Jeder AVR Mikrocontroller hat einen PORTB.
Wenn Sie einen einzelnen Pin High oder Low setzen wollen dann können Sie den SET bzw. RESET Befehl benutzen. Vorher muss definiert werden ob die Pins für Eingabe oder für Ausgabe benutzt werden sollen.
Dafür gibt es ein Register mit dem Namen DDRx für jeden Port. In unserem Beispiel heißt es DDRB. Wenn Sie eine 0 an die entsprechende Position im DDR-Register schreiben dann kann der Pin für Eingabe benutzt werden. Wenn Sie eine 1 schreiben dann kann der Pin für Ausgabe benutzt werden. Sie können auch die folgende Schreibweise benutzen: CONFIG PORTX.Y= INPUT|OUTPUT
Nachdem das Richtungs-Bit (im DDR-Register) gesetzt ist kann man entweder das PORTx-Register zum Setzen eines Logik-Pegels benutzen oder das PINx-Register um den Pin-Zustand einzulesen.
Das dritte Register ist das PINx-Register. In unserem Beispiel PINB.
Wenn wir zum Beispiel PORTB.7 als AUSGABE-Pin benutzen möchten:
CONFIG PORTB.7=OUTPUT ' schreibt eine '1' in DDRB.7
SET PORTB.7 ' setzt das most significant Bit auf +5V
RESET PORTB.7 ' setzt das most significant Bit auf 0 V
Bei Benutzung eines Pin als Eingabe-Pin kann man einen internen Pullup-Widerstand aktivieren. Pullup bedeutet, dass der Pin mit einem Widerstand mit VCC verbunden wird.
Um den Pullup-Widerstand zu aktivieren schreiben Sie eine '1' in das PORT-Register
Beispiel zum Lesen vom PORTB.0-Pin :
CONFIG PORTB.0=INPUT ' setzt DDRB.0 auf '0'
PORTB.0=1 ' Internen Pullup-Widerstand aktivieren Print PINB.0 'Liest das Least Significant Bit (B.0) und gibt es über RS-232 aus
Sie können auch PORTx lesen aber das gibt dann den Wert zurück, der zuletzt in PORTx geschrieben wurde und NICHT den Zustand am Eingabe-Pin.
Zum Lesen und Schreiben ganzer Bytes :
PORTB = 0 'schreibt 0 in das Register wodurch alle Pins Low werden
PRINT PINB 'gibt die Eingabe an den Pins aus
Ich möchte Spezialzeichen schreiben aber sie werden nicht korrekt angezeigt:
Das ist nicht unbedingt ein Anfängerproblem aber es wird hier mit aufgeführt damit Sie es gut finden können.
Einige ASCII-Zeichen über 127 werden falsch interpretiert in Abhängigkeit von den Landeseinstellungen. Um das richtige Zeichen auszugeben benutzen Sie : PRINT "Test{123}?"
Das {xxx} wird durch das richtige ASCII-Zeichen ersetzt.
Sie müssen 3 Ziffern benutzen denn sonst denkt der Compiler, das Sie zum Beispiel {12} schreiben wollen. Sie müssen stattdessen {012} schreiben.
Mein Programm funktionierte gut aber mit einem neuen Mikrocontroller ist es langsam und gibt komische Ausgaben
Die meisten neuen Mikrocontroller haben einen internen Oszillator, der werksseitig aktiviert ist. Da dieser mit 1, 4 oder 8 MHz läuft kann das langsamer oder schneller sein als Ihr externer Quartz. Daraus resultiert eine langsamere bzw. schnellere Taktung.
Da die Baudrate vom Takt abgeleitet ist ergeben sich auch falsche Baudraten.
Lösung : Ändern Sie die Taktzahl mit $crystal so dass sie dem internen Oszillator entspricht.
Oder ändern Sie die Fusebits so dass der externe Takt benutzt wird.
Einige Bits des Port C funktionieren nicht
Einige Mikrocontroler haben ein JTAG-Interface. Disablen Sie dieses mit den Fusebits. Oder benutzen Sie DISABLE JTAG im Programmcode.
Languages | English • Deutsch |
---|