Hallo Leute, ich bin leider ein kompletter Neuling was uCs angeht und wahrscheinlich ist diese Frage auch schon mal wo beantwortet, aber leider bin ich nicht fündig geworden. Für euch dürfte das kein Problem sein, aber ich meinen ATMega128 erst seit Montag ... naja, ich arbeite derzei noch mit den Beispielprogrammen. Also, hier mein Problem. Ich hab an PortB ein paar Taster angeschlossen (4 Stk.) und ich möchte jetzt auf das Drücken einer Taste reagieren. Ich arbeite mit Bascom. Muss ich da einen Interrupt verwenden? Wenn ja, wie kann ich einem Interrupt sagen, dass er für PortB zuständig ist? Also, besten Dank schon mal im vorraus.
du must deinen port als eingang konfigurieren ($FF ins DDRB schreiben) und auslesen (wert von PINB holen). wie das geht, steht oben links im avr-tutorial. das ist zwar für assembler, zeigt aber die notwendigen schritte. bascom kann ich nicht. wenn du das ganze noch verbessern willst, such mal nach dem stichwort "tasten entprellen". ohne diese maßnahme wirst du bald keinen spaß an deinen tests haben (programm reagiert komisch bzw. unerwartet auf eingaben). mit interrupts ist das ganze zu overdosed. ich kenne jetzt den mega128 nicht, aber auf welche eingänge er mit einem interrupt reagiert, steht im datenblatt und ist nicht veränderbar. es wären (vermutlich) auch nicht 4 Eingänge möglich (meist nur zwei).
Danke für Deine schnelle Antwort. Das mit dem Entprellen ist mir schon klar, aber das ist ja eher eine Elektronische Geschichte ... Das heißt also, ich kann nur auf die beiden Eingänge mit einem Interrupt reagieren? Was ist aber, wenn ich sagen wir mal auf 4 Tasten mit einem Interrupt reagieren möchte? Geht das dann garnicht?
"Das mit dem Entprellen ist mir schon klar, aber das ist ja eher eine Elektronische Geschichte ..." Warum Elektronik bemühen, wenns die Software so nebenbei machen kann ? Entprellen und Flankenerkennung von bis zu 8 Tasten so nebenbei mit im Timerinterrupt ist einfacher, als jede Taste extra, lohnt sich sogar bei nur einer Taste. Siehe "Tasten entprellen - Bulletproof" Peter
Klingt interessant, aber so weit bin ich noch nicht, dass ich mit Timern umgehen könnt ;o) zuerst mal zu den Taster
Ok, ich hab das jetzt mal so gemacht, aber irgendwie funktioniert das nicht: Config Portb = Input Do If Portb > 0 then GoSub Irgendwas End If Loop Kann mir wer sagen, was ich da falsch gemacht hab?
>Das heißt also, ich kann nur auf die beiden Eingänge mit einem Interrupt reagieren? Was ist aber, wenn ich sagen wir mal auf 4 Tasten mit einem Interrupt reagieren möchte? Geht das dann garnicht? so in etwa. zumindest nicht so, daß jede taste ihren eigenen interrupt bekommt. geht ja auch nicht, daß jeder der wichstigste sein will..... du kannst natürlich die tasten parallel zu ihren port-eingängen mit einem 4fach-oder verknüpfen und dessen ausgang auf den interrupt eingang legen. dann wird bei jeder taste (der gleiche) interrupt ausgelöst und du mußt dann noch in der isr rausfinden, welche taste es denn war. wird aber schwierig, da du nicht garantieren kannst, das zu diesem zeitpunkt der tastenzustand noch der gleiche ist. an die dannegger-tasten-entprellung mußte dich wagen, es hilft nichts. die ist auch noch richtig gut.... >aber so weit bin ich noch nicht, dass ich mit Timern umgehen könnt soweit war ich auchmal (also ich verstehe deine aussage und habe sie selbst mal so getroffen), aber glaube mir, timer tun keinem weh, sind eigentlich leicht zu bedienen und bieten eine fülle von möglichkeiten...
keine ahnung, wie bascom geht, aber das hier: If Portb > 0 then ist wohl dein problem. du mußt den port einlesen (siehe mein erstes post), also eher: If pinb > 0 then oder so ähnlich.
So in der Richtung hab ich schon gedacht, was das mit den Interrupts her kenne (ist vielleicht doch noch was von der Digitaltechnik in der Berufschule hängen geblieben?) Ja, das mit den Timern ist wichtig, keine Frage, aber ich möchte doch nur, dass er irgendwas macht, wenn ich auf diese Taste drücke ... Aja, die Taster sind bereits entprellt (Mechanisch)
Ok, das hab ich jetzt probiert, aber irgendwie macht der sowieso was er will ... also, das sieht jetzt so aus: Config Porta = Input Do If Pina > 0 Then Gosub Irgendwas End If Loop Jetzt springt er immer wieder in die Rutine "irgendwas" obwohl kein Taster gedrückt ist ... obwohl nicht mal ein Taster an Porta drann ist ...
das liegt daran, daß die internen pullups für ein high an jedem port sorgen. taster werden normalerweise als low-aktiv geschaltet, also: taster nicht gedrückt->high-pegel am port taster gedrückt -> low-pegel am port entweder invertierst du vor der auswertung den registerinhalt von pina oder fragst halt ab, ob der inhalt kleiner FF (anstelle von größer als 0) ist.
Dann gib doch mal den Inhalt von Pina an einem anderen Port aus und sieh nach, was dann eigentlich dein Atmel so fuer Portwerte sieht. Dann vergleichst Du mit dem was Deiner Meinung nach am Port anliegen muesste, testest vielleicht mal einen Taster (der muesste sich dann in der Ausgabe wiederspiegeln) und dann sieht man weiter wo sich deine Vorstellung von der Realitaet unterscheidet und ergruendet warum das so ist. Ja so ist das Leben als Programmierer. Zwischen Theorie und Praxis ist oftmals ein grosser Unterschied. Da brauchts oft ein bischen Kreativitaet um dem auf die Schliche zu kommen.
Kann ich auf einen Ausgang des uC direkt eine LED anhängen? uC -------|R(470)|------>|------ Masse LED
Kannst Du. Aber anders rum uC --- | R | ---- |< ----- Vcc Der Grund ist einfach: Die AVR koennen mehr Strom senken als sie liefern koennen. Wenn da von Vcc ein Strom in den Pin hineinläuft, dann ist das besser als wenn der AVR den Strom liefern muss. Nachteil: Die LED leuchtet wenn der Pin auf 0 ist und umgekehrt.
Danke für die Antwort. Im Prinzip ist mir das ja egal, ob die Led leuchtet wenn ich 0 auf dem Pin habe oder nicht. Ist ja nur eine Frage der Software ;o)
Wieso willst du dann eine LED an deinen Pin anschliessen, wenn es dir sowieso egal ist, ob sie leuchtet oder nicht? ;)
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.