Hallo zusammen - ich habe hier eine Denkblockade vom feinsten :-) Vielleicht kann mir jemand auf die Sprünge helfen. Ich komme aus dem 8051-Lager und will nun endlich komplett auf AVR umsteigen (habe aber leider ein paar Jahre nichts mehr gemacht, habe also einiges aufzuarbeiten..) AVRStudio läuft, STK500 ebenfalls, die ersten Tests mit der RS232 waren erfolgreich etc. pp. NUR ... Folgendes ist mein Problem: Beim 8051 konnte ich die I/O Ports direkt abfragen/beschreiben, das ging fix und ohne viel Aufwand. Bei den AVR's (aktuell habe ich ein paar 2313 hier) muss nun gesagt werden, wer Eingang/Ausgang ist, dann wird das Bit geschrieben bzw. kann abgefragt werden. Alle Beispiele die ich finde beziehen sich auf Eingang PortD - Ausgang PortB. Ich möchte PortD aber für andere Dinge freihalten. PortB - 0 - Taster (schaltet PortB 2) PortB - 1 - Taster (schaltet PortB 3) PortB - 2 - LED PortB - 3 - LED Wie bringe ich es nun fertig nur die Taster abzufragen und die LED's zu bedienen? Alle anderen Ports an B sollen nicht berührt werden. Die Lösung wird einfach sein.- aber ich komm nicht drauf ..grml.. Danke und Gruß, Heiko
Ausgangspins für Ports im IO-Bereich SBI/CBI, Eingangspins SBIS/SBIC. Sonst Port/Pin entsprechend maskieren, dann geht auch alles andere.
Heiko Haedicke schrieb: > Die Lösung wird einfach sein.- aber ich komm nicht drauf ..grml.. > AVR-Tutorial
Danke für die Tipps !!! Das Tutorial ist klasse, habe schon einiges gelesen. Habe es mal mit "Ausgangspins für Ports im IO-Bereich SBI/CBI, Eingangspins SBIS/SBIC" versucht. Die direkte Bitmanipulation ind der Form war mir bisher nicht bewusst. Bin nun mal wieder auf PortD und PortB ausgewichen um das mit dem STK500 zu testen. Soweit ok, aber da stimmt noch was nicht. Wenn ich einen der Taster gedrückt halte kommt ein Rechtecksignal am entprechenden LED Pin raus (wie geht das denn - ich setzte den LED Port doch nirgendwo mehr zurück) und der Zustand nach loslassen des Tasters ist nicht fix. Laut Programm sollte beim einmaligen Tasten eines Tasters die LED doch angehen und anbleiben ... Gruß, Heiko.
Heiko Haedicke schrieb: > Wenn ich einen der Taster gedrückt halte kommt ein Rechtecksignal am > entprechenden LED Pin raus (wie geht das denn - ich setzte den LED Port > doch nirgendwo mehr zurück)
1 | sbi pinb,pinb0 ; LED 0 an |
Schlage im Datenblatt nach, was ein Schreiben in das PIN-Register bewirkt. (kleiner Hinweis: eigentlich möchtest du hier das PORT-Register verwenden)
Hallo Heiko, ich habe mir mal Deinen Quelltext "ASM.txt" angeschaut und daraus einige Fehler erkannt. Diese beseitigt und was Brauchbares daraus gemacht. In der ersten Anwendung werden nur zwei Leds hintereinander eingeschaltet, mehr geschieht dann nicht. In der zweiten Anwendung werden bei drücken von zwei Tasten entsprechende Leds Ein- und Ausgeschaltet. Ich möchte aber erst den Moderator fragen, ob ich die Quelltexte einstellen soll oder nicht. Denn gerade Anfänger sollen sich über das Tutorial einarbeiten. Also ich warte erst mal...wie die Meinung ist. Grüße Rolf
Hallo Rolf, Fehlerkorrektur ist immer gut, gerade die Fehler die man am Anfang macht schleppt man immer weiter mit sich und irgendwann werden sie sich rächen. Ich weiss nicht warum ich mit der Art der Ein/Ausgabe bei den AVR's so auf Kriegsfuß stehe - die direkte Bitmanipulation meine ich hier insbesonders. Und ja, das Tutorial ist klasse und lohnt sich auf jeden Fall. Bzgl. Posten oder nicht - besser ist es doch wenn Du es postet, solange dieser Thread hier zur Verfügung steht - nicht das der Ein oder Andere meinen Fehlerhaften Quelltext findet und meine Fehler weiterverarbeitet.. Schöne Ostertgüße, Heiko.
Rolf H. schrieb: > Ich möchte aber erst den Moderator fragen, ob ich die Quelltexte > einstellen soll oder nicht. > Denn gerade Anfänger sollen sich über das Tutorial einarbeiten. > Also ich warte erst mal...wie die Meinung ist. "Stell ein den Scheiß!" Das Tutorial ist klasse! Wenn man einfach so Beispiele kopieren kann (davon kann es gar nicht genug geben) die für genau den µC geschrieben sind und mit denen rum probieren kann, sie ändern kann, dann hilft das oft (mir z.B.) ungemein weiter. Außerdem, du musst gar keinen Fragen! Und jeder kann doch selbst entscheiden, ob er nur "abschreibt" oder selbst was macht. Wir sind hier weder in der Schule noch muss ich hier "Papa" fragen. "Hau raus!"
ok, also dann mal los! Kritik kann ich vertragen, sollte was aus meinen Ausführungen nicht richtig sein. Was fällt mir im Einzelnen auf: 1. den Programmbeginn gestalte ich anders, denn der Tiny muß ja erst mal wissen, was ich mit den Registern "DDRB bzw. DDRD" vorhab. Erst dann beginnt das setzen oder löschen der Pins. D.h. unter ;Vorbereitung wird erst mal alles dem Tiny vorgegeben was in Frage kommen soll. (Interrupt, PWM usw.) 2. sbis ist nicht richtig, wenn Du wie in Deinem Text PIND0 auf LOW ziehen willst. Also sbic...ok! 3. led2an: sbi pinb,pinb0 muß lauten sbi PORTB,PB0 ;denn DDRB ist auf OUTPUT Das Gleiche mit led3an Hier mein erster Quelltext, um die Leds nur zum leuchten zu bringen. Die Hardware: Tastesw1 an PIND,PD0, Tastesw2 an PIND,PD1 beide gegen GND geschaltet / rote Led an PORTB,PB0 / grüne Led an PORTB,PB1 ; Projekt-Name: Projekt01 Datum: 30.03.2013 ; Datei: Tiny2313-test01.asm ; AVR: Tiny2313-20PU .INCLUDE "tn2313def.inc" ; Deklaration für Tiny2313 rjmp reset ; Reseteinsprung reset: ;Vorbereitung PORTB und PIND ldi r16,(1<<PB0) | (1<<PB1) out DDRB,r16 ; PB0 + PB1=Output clr r16 ; alle Pins in r16=Low out DDRD,r16 ; Datenricht. PD0-PD6=Input ldi r16,0x7F ; 0b0111.1111 out PORTD,r16 ; PD0 bis PD6=PULLUP clr r16 ; beide LEDs zu Beginn AUS out PORTB,r16 loop: tastesw1: sbic PIND,PD0 rjmp tastesw1 rcall ledrotein tastesw2: sbic PIND,PD1 rjmp tastesw2 rcall ledgnein rjmp loop ledrotein: ; rote LED an PB0=EIN sbi PORTB,PB0 ret ledgnein: ; grüne LED an PB1=EIN sbi PORTB,PB1 ret .EXIT Aber was bringt das Ganze, die beiden Leds leuchten und mehr nicht, über Reset sind sie wieder dunkel. Zweiter Quelltext, wo jetzt wechselhaft die Leds über die beiden Tasten hell und dunkel geschaltet werden. Dazu verwende ich gern Unterprogramme mit rcall Grüße Rolf
Sorry, hier ist der zweite Quelltext! ;Vorbereitung PORTB und PIND ldi r16,(1<<PB0) | (1<<PB1) out DDRB,r16 ; PB0 + PB1=Output clr r16 ; alle Pins in r16=Low out DDRD,r16 ; Datenricht. PD0-PD6=Input ldi r16,0x7F ; 0b0111.1111 out PORTD,r16 ; PD0 bis PD6=PULLUP clr r16 ; beide LEDs zu Beginn AUS out PORTB,r16 loop: tastesw1: sbic PIND,PD0 ;sbic Tastenabfrage auf LOW rjmp tastesw1 rcall ledrotein tastesw2: sbic PIND,PD1 rjmp tastesw2 rcall ledgnein rjmp loop ledrotein: sbi PORTB,PB0 ; rote LED an PB0=EIN cbi PORTB,PB1 ; grüne LED an PB1=AUS ret ledgnein: sbi PORTB,PB1 ; grüne LED an PB1=EIN cbi PORTB,PB0 ; rote LED an PB0=AUS ret .EXIT
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.