Hallo, ich bin ein Neuling in Sachen AVR programmierung. Wollte mir die Basics beibringen und dazu mit dem Pollin "Atmel Evaluations-Boars V2.0.1 und Atmel Addon Board V1.0" vier LED's im BCD-8421 Code zum leuchten bringen. Über zwei Taster soll inkrementiert bzw. dekrementiert werden. Allerdings funktioniert es nicht ganz, nach einschalten des uc leuchten die vier LED's gleich und die Taster haben keine Funktion. Mir scheint es als ob die "sbic" befehle ignoriert werden und er gleich zu "plus" springt und das Register erhöht. Kann mir vielleicht jemand Helfen? Hier mein Programm soweit: .include "m8def.inc" ldi r16, 0b00001111 out DDRD, r16 ldi r16, 0b11110000 out PORTD, r16 ldi r16, 0b00000000 out DDRB, r16 ldi r16, 0b11111111 out PORTB, r16 ldi r16, 0b00000000 abfrage: sbic PINB, 0 rjmp plus sbic PINB, 1 rjmp minus rjmp abfrage plus: inc r16 out PORTD, r16 rjmp abfrage minus: dec r16 out PORTD, r16 rjmp abfrage
Hallo, war es bei den Pollin-Boards nicht so, daß die Taster gegen + schalten und extern PullDown-Widerstände haben? Aber das hast Du ja sicher im Schaltplan nachgesehen. Gruß aus Berlin Michael
Hallo Michael, ja bei den Pollin Boards ist es so das die Taster gegen Vcc schalten und ein 60KOhm PullDown Widerstand haben.
Ich kenne das Pollin-Board nicht, aber ich vermute, dass am Port B die Taster hängen. Wenn diese -wie Du schreibst- an Vcc mit 60 kOhm Pulldown hängen, Du aber die internen Pullupwiderstände -die lt. DB 20 bis 50 kOhm haben- aktiviert hast, lesen die Tasteneingänge immer "1". Und da die Taste "Plus" zuerst abgefragt wird, wird r16 ständig incrementiert. Das geht so schnell, das Du an allen LED-Ausgängen eine PWM mit 50% Aktivzeit hast, die die LEDs gleichmäßig leuchten lassen. Häng mal (so vorhanden) ein Oszi an die LED-Ausgänge, dann siehst Du es. Änderungsvorschlag: > ldi r16, 0b11111111 ;Pullup aktiv > out PORTB, r16 ändern in: ldi r16, 0b00000000 ;Pullup deaktiviert out PORTB, r16 Reinhard
Hallo Reinhard, danke für deinen Vorschlag. Bin mir jetzt nicht mehr ganz sicher, aber ich glaube ich habe es, so wie du beschrieben hast, schon mal probiert gehabt. Weil ich mir sowas schon gedacht habe. Aber zur Sicherheit probiere ich es heute Abend, wenn ich zuhause bin, noch einmal aus.
kontrollier mal dene Jumpereinstellungen ich hab schon Stunden Fehler im Code gesucht und am Ende war ein dummer Jumper beim Pollin Board flsch gesteckt.
Mhhh eigentlich müssten die Jumper stimmen. Bei dem Pollin Board sind die Ports auf einen 40pol Stecker gelegt. Über diesen Stecker dann auf das Addonboard mit den LED's und Taster. Auf diesem Addonboard wird dann alles über Kabel verbunden. Habe die vier LED's an Port D 0..3 und die zwei Taster an Port B 0..1. Es sind übrigens 33KOhm Pulldown Widerstände, nicht wie erst von mir behauptet 60KOhm.
Du solltest mal festzustellen, was an den LED-Ausgängen anliegt. Du schreibst, die LEDs leuchten. Hast Du Zugriff auf ein Oszilloskop? Dann kontrolliere damit die Ausgänge für die LEDs, ob diese permanent Ein sind oder ob dort ein Rechtecksignal anliegt. Den Unterschied siehst -ohne Vergleich- optisch nicht. Eine Möglichkeit das ohne Oszi festzustellen, wäre, eine der LEDs permanent einzuschalten. Mit dem Befehl sbi PortD,3 gleich nach der jeweiligen Portausgabe setzt Du eine LED auf Ein. Also: plus: inc r16 out PORTD, r16 sbi PortD,3 rjmp abfrage minus: dec r16 out PORTD, r16 sbi PortD,3 rjmp abfrage Leuchtet diese LED jetzt heller, ist das ein Indiz dafür, das Du ein Rechteck an den anderen Ausgängen hast, bei gleicher Helligkeit scheint permanent Ein zu herrschen. Miß mal die Spannung an den Eingangspins der Taster, die Du benutzt, einmal mit losgelassenem und einmal mit gedrücktem Taster und poste die Ergebnisse hier. Miß aber direkt am Prozessorpin, so siehst Du was da wirklich ankommt. Du kannst auch versuchen, die Pulldownwiderstände von dem Board zu verkleinern, z.B. auf 1 bis 5 kOhm. Vielleicht nur mal provisorisch für die benutzten Taster. Mehr als ein etwas erhöhter Stromverbrauch bei gedrückten Tastern passiert da nicht. Aber die Eingangspegel werden sicherer. Viel Erfolg. Reinhard
Also irgendwie ist das ganz komisch. Taster 1 funktioniert einwandfrei. Nicht gedrückt = 0V, gedrückt = 5V. Taster 2 allerdings ist bei nicht gedrückt = 2.7V und bei gedrückt = 5V. Beim AVR ist es aber anders. Am Pin PB0 ist immer 5V, Taster drücken oder nicht macht keinen Unterschied. Am Pin PB1 ist immer 0V, egal ob Taster gedrückt oder nicht.
Wenn ich das Kabel ziehe das an den Taster 2 geht, funktioniert der Taster auch einwandfrei. Auf dem Kabel sind allerdings 5V. Wenn ich die Taster nicht angeschlossen habe liegt an Pin PB0 5V und an PB1 0V.
Was Du am Pin direkt mißt, das "sieht" auch der Prozessor. Deshalb solltest Du zuerst mal die Verdrahtung kontrollieren und Fehler beseitigen, bis Du an beiden Taster-Pins die richtigen Spannungen messen kannst, also bei Taster nicht gedrückt Nähe 0V und bei Taster gedrückt sollte dei Betriebsspannung zu messen sein. Solange das noch nicht klappt, kann das Programm auch nicht richtig laufen. Reinhard
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.