Ich sende vom PC aus ein t und die LED an meinem ATMEGA 8 beginnt zu leuchten. Diese LED erlischt allerdings nach ca. einer Sekunde. Was muss ich an Code hinzufügen, dass das nicht passiert d.h. die LED "ewig" leuchtet? Code: $regfile = "m8def.dat" $baud = 9600 $crystal = 4000000 Dim I As Byte Config Pinb.0 = Output Do If USR.RXC = 1 Then i = UDR Select Case i Case "H" Print "Hallo" Case "h" Print "hallo" Case "t" Portb.0 = 1 Case Else Print "Unbekannter Befehl" End Select End If Loop End
Schwer zu sagen, vielleicht passiert es wenn sich der Chip resettet, warum auch immer...!? Wie auch immer, mach das Interrupt gesteuert - Guck mal in deiner BASCOM Hilfe - und zwar gibs nen Interrupt aka "on rxd" - wenn was empfangen wird, gibs den interrupt und deine Bedingungen die du jetzt in der do -loop hast, fügst du in die Interruptschleife ein. Wenn du fragen zum genaue Code hast - kann ich heute nachmittig mal gucken gruss
INT0, INT1, INT2, INT3, INT4,INT5, TIMER0 ,TIMER1, TIMER2, ADC , EEPROM , CAPTURE1, COMPARE1A, COMPARE1B,COMPARE1 Das sind alles Interrupts die ich starten kann, nur welches ist für UART? Das hab ich noch nit ganz geschnallt. Danach kann ich se ja auf low level: Pin auf Masse Falling: fallende Flanke Rising: steigende Flanke Flanke ist wie ich das verstanden habe ein steigender bzw fallender Wert am PIN Nur irgendwie versteh ich es noch nicht ganz. Erster Ansatz der natürlich nicht funktioniert: $regfile = "m8def.dat" $crystal = 4000000 $baud = 9600 Dim I As Byte Config Pinb.0 = Output On URXC OnRxD Enable URXC Enable Interrupts Main: If Usr.rxc = 1 Then i = UDR Select Case i Case "H" Print "Hallo" Case "h" Print "hallo" Case "t" Portb.0 = 1 Case Else Print "Unbekannter Befehl" End Select End If Goto Main OnRxD: Incr I Return vorallem das OnRxD lässt mich rätseln
Hallo, dein Prog sollte normalerweise funktionieren. Anders kannst du es so machen. Setz mal das Print "Start" an den Anfang, dann kannst du sehen ob der Chip einen Reset macht oder nicht. Und ob du Do-Loop oder Label-Goto benutzt ist egal. Interrupt für sowas einzusetzen ist imho übertrieben wenns nicht wirklich mehr werden soll. Als Tip, schliess die LED nach VCC an, da der Atmel die LED gegen Masse direkt treiben kann (Vorwiderstand nicht vergessen). Dann natürlich die Befehle invertieren, also Ein wird 0 und Aus wird 1 $regfile = "m8def.dat" $baud = 9600 $crystal = 4000000 Ein Alias 1 Aus Alias 0 Dim I As Byte Config Pinb.0 = Output Portb.0=Aus Print "Start" Do ' Main: i = Ischarwaiting() ' ist ein Zeichen da If i = 1 Then ' ja, da ist was i = Waitkey() ' nimm es Select Case i ' und werte aus Case "H" Print "Hallo" Case "h" Print "hallo" Case "t" Portb.0 = EIN Case Else Print "Unbekannter Befehl" End Select End If Loop ' Goto Main End
Kommt, wenn die LED ausgeht, die Meldung "Unbekannter Befehl" ? >Das sind alles Interrupts die ich starten kann, nur welches ist für >UART? Das hab ich noch nit ganz geschnallt. Komisch. Hier: http://www.rowalt.de/mc/avr/avrboard/04/avrb04.htm findet sich nicht nur die Vorlage für dein Programm, sondern auch die Variante mit Interrupt. Oliver
habe es aus mehren Seite zusammen getragen. Manchmal hilft scrollen. Nur copy past nützt nicht viel, wenn man es anschließend nicht versteht. Das ohne Interrupts hab ich verstanden nur den Sprung über den Rand schaffe ich noch nicht Ist Enable URXC 'Interrupt URXC einschalten Enable Interrupts 'Interrupts global zulassen frei gewählt? oder ist URXC eine vorgegebene Variable bzw ein Interrupt? Fals ja wo steht es?
???? http://www.rowalt.de/mc/avr/avrboard/04/avrb04.htm noch weiter scrollen (und auch lesen). Da steht doch alles drin. >Fals ja wo steht es? In der Bascom-Doku, und bei google Oliver
Also kann ich jedes Interrupt bennen wie ich möchte bis auf ein paar Ausnahmen?
nette mann schrieb: > Also kann ich jedes Interrupt bennen wie ich möchte bis auf ein paar > Ausnahmen? Der Name des Interrupts (des Ereignisses) ist vorgegeben. Aber die Funktion die den Interrupt bearbeitet, kannst du benennen wie du lustig bist. Mittels On URXC OnRxD stellst du ja dann sowieso die Verbindung zwischen dem Interrupt-Ereignis (in diesem Fall URXC) und der aufzurufenden Funktion (in diesem Fall OnRxD) her. Wenn deine Funktion, die diesen Interrupt bearbeitet SchnurdiBur heist, dann schreibst du halt On URXC SchnurdiBur natürlich brauchst du dann aber auch die entsprechende Funktion dafür SchnurdiBur: .... Return
Bascom-Doku, Kapitel 6.277 >ON INTERRUPT >Action >Execute subroutine when the specified interrupt occurs. >Syntax >ON interrupt label [NOSAVE] >Remarks >Interrupt INT0, INT1, INT2, INT3, INT4,INT5, TIMER0 ,TIMER1, TIMER2, ADC , >EEPROM , CAPTURE1, COMPARE1A, COMPARE1B,COMPARE1. Or you can >use the AVR >name convention: >OC2 , OVF2, ICP1, OC1A, OC1B, OVF1, OVF0, SPI, URXC, >UDRE, UTXC, ADCC, ERDY and ACI. Das sind die vordefinierten Interrupt-Namen. Die versteht Bascom. Das ist jetzt zwar alles auf Englisch, aber die paar Worte wirst du ja noch hinkriegen. Oliver
mit INT kann ich wenig anfangen denke das ist ADC CAPTURE ist irgendwas mit einfangen der rest ist logisch
Nette Mann schrieb:
> mit INT kann ich wenig anfangen denke das ist ADC
Man sollte vielleicht auch noch dazu sagen:
B e s o r g D i r d a s D a t e n b l a t t
z u D e i n e m P r o z e s s o r !
Die unverständlichen Kürzel heissen in BASCOM deswegen so, weil sie
Atmel im Datenblatt auch so genannt hat. Wenn du also mit INT0 im
Datenblatt suchen gehst, wirst du fündig und erfährst alles was du
darüber wissen willst.
Es ist ein Irrtum zu denken, nur weil einem Bascom vieles abnimmt, dass
man sich mit der zugrundeliegenden Hardware nicht mehr beschäftigen
muss. Und die wiederrum ist mit ihren Fähigkeiten ausführlichst im
Datenblatt beschrieben.
jetzt kommt es so rüber als ob ich copy past lieben würde. Dem ist nicht so! 2 0x001 INT0 External Interrupt Request 0 3 0x002 INT1 External Interrupt Request 1 also soll heißen wenn das interruppt genutz wird, das bestimmte ports entweder dauerhauft 0 oder 1 ist ?? und das ganze ist ja dann auch auf ner höheren ebene als wenn man PORT.C = 1 nehmen würde
Lies das Datenblatt, kauf dir ein Buch, oder lies das hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts (und bitte nicht nur diesen Abschnitt lesen, sondern das ganze Tutorial). Erst lesen, dann fragen. Sonst wird das nichts. Oliver
habs gerafft. Interrupt läuft neben dem Hauptprogramm. Das haupt programm wird schematisch abgearbeitet und das Interrupt nur dann, wenn sich was ändert was im Interrupt festgelegt wurde. Also main PB.1 = 1 isses main programm das wird immer von oben noh unten abgerattert. Sollte also eine Bedingung die nicht als Interrupt gespeichert ist, sich ändern aber der µC ist nicht an der Stelle dann hat man eben Pech (bei mir das mit der LED) Im Interrupt wird ständig geprüft ob was anders ist. So hab ich es verstanden.
Na ja, etwas wirr, aber vermutlich trifft es das. Um auf deine Ausgansgfrage zurückzukommen: >Was muss >ich an Code hinzufügen, dass das nicht passiert d.h. die LED "ewig" >leuchtet? Nichts. In deinem Ursprungs-Programm von ganz oben wird die LED nie ausgeschaltet. Wenn die doch wieder ausgeht, stimmt was anderes nicht. Störungen auf Stromversorgung oder am Reset-Pin, was auch immer. Oliver
Reset denke ich da der mk2 öfters sagt das das RESET falsch sei Habe es so: 5V----10KOHM--| | GND---47nF---PIN1 | ISP-RESET---
nehm ich die 47nF weg leuchtet die LED länger allerdings resettet der mk2 den ATmega danach gleich liegt am ISP programmier gerät
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.