- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 11

Thema: RN-Control: Tasten abfragen per Interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    40
    Beiträge
    38
    Ok, danke für Eure Mühe, habe mich nun mal an Searchers Methode gewagt, die Brücke auf dem RN-Control gesetzt und den Code angepasst. Da ich aber selbst noch lange nicht so tief in den Registerinterna des ATmega32 drin bin, einige Fragen:

    Code:
     
    Adcsrb = Adcsrb Or &B00000010
    SFIOR = SFIOR or &B01000000

    Code:
    Admux = Admux Or &B00000011
    Admux = Admux Or &B00000111

    Die zweite Zeile der beiden Codesegemente ersetzt jeweils die erste Zeile beim ATmega32, oder?
    In der Zeile mit Adcsrb meckert der Compiler über Invalid datatype. Muss ich da was beachten oder gilt die Zeile nur für Deinen ATtiny45 und fliegt somit raus?


    Bei Adc_result sagt der Compiler Unknown statement, hast Du da etwas vergessen?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo dariegel,
    um zu verstehen, wie das Programm funktioniert, solltest Du unbedingt das Datenblatt zu deinem µC lesen und verstehen.

    Ich habe dieses für den Mega32 benutzt: http://www.atmel.com/dyn/resources/p...ts/doc2503.pdf

    Dort gibt es das Register ADCSRB für Mega32 nicht - deshalb der Compiler Fehler. In meinem Code wird mit Adcsrb = Adcsrb Or &B00000010 für ATtiny45 der ADC auf Start der Messung durch INT0 eingestellt. Im ATmega32 wird das im SFIOR Register gemacht. Also die Zeile mit ADCSRB raus und die Zeile mit der SIFOR Zuweisung rein.

    Zeile ADMUX: Du mußt für Dein RN-Control Board den ADC-Kanal 7, an dem die Tasten angeschlossen sind, an den ADC "anschließen". Das macht Admux = Admux Or &B00000111 auf dem Mega32. Auf meinem ATtiny habe ich einen anderen Kanal genutzt und deshalb sieht das bei mir etwas anders aus.

    Noch etwas zum GETADC. Das ist laut Bascom Hilfe zum Ausführen einer Einzelmessung da. Einzelmessung wird in meinem Code nicht genutzt. Der ADC wird auf Start der Messung durch Setzen des INT0 Flags eingestellt. Damit ist GETADC durch den Aufbau des Programms gar nicht sinnvoll und der Meßkanal, der in GETADC übergeben werden muß, muß "manuell" eingestellt werden. Im Simulator kann man nachvollziehen, welche Register im µC durch die entsprechenden Befehle zB CONFIGADC wie gesetzt werden.

    Das Programm funktioniert also grob so, daß bei Drücken einer Taste das INT0 Flag gesetzt wird (Signal kommt über die Brücke zu dem entsprechenden µC Pin (PD2) ) Dadurch wird eine ADC Messung getriggert und bei Beendigung der Messung erzeugt der ADC einen Interrupt. In der zugehörigen ISR wird dann der Messwert aus den ADC Registern ausgelesen und steht zur weiteren Auswertung in den entsprechenden Variablen bereit. Weil keine INT0 Interrupt Routine ausgeführt wird, bleibt das INT0 Flag stehen und muß deshalb noch durch Schreiben einer 1 gelöscht werden damit es beim nächsten Tastendruck wieder gesetzt werden kann um die nächste Messung triggern zu können.

    Ich möchte nochmal drauf hinweisen, daß das Programm funktioniert aber nicht perfekt ist. Eben nur eine Idee. Liegt an Dir was Du daraus machst oder doch eine andere Lösung verwirklichst.

    Bei Adc_result sagt der Compiler Unknown statement, hast Du da etwas vergessen?
    Nein, nichts vergessen, sondern da gehört das rein, was auch immer Du mit dem Meßergebnis anfangen möchtest - vielleicht auch gar nichts in der ISR und wertest ADC_result zwische DO und LOOP aus.

    Ebenso ist der Header mit $HWSTACK nicht vollständig. Die hatte ich nur eingefügt um Dir zu zeigen, das der Wert mit 32 in Deinem Programm zu klein ist.

    PS in meinem Code ist Portb.2 und Portb.3 natürlich auch nur für mich zutreffend. Die mußt Du bei Dir auch entsprechend anpassen

    Gruß
    Searcher
    Geändert von Searcher (27.06.2011 um 08:37 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    40
    Beiträge
    38
    Ok, jetzt habe ich es verstanden. Werde sehen, ob ich's zum Laufen kriege.


    Danke.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo dariegel,

    falls es läuft, sag mir bitte Deine Erfahrungen.

    Weil ich schon mal dabei war und ich das auch brauchen kann, hab ich versucht eine etwas bessere Tastenabfrage zu machen. Vielleicht noch nicht optimal, weil theoretisch immer noch zB. Fehlerkennungen auftreten können. Für mich arbeitet es jedoch zufriedenstellend.

    In dem neuen Programm wird durch den INT0 ein Indikator für das Hauptprogramm gesetzt. Also Brücke zwischen PA7 und PD2 muß drin sein.

    Das Hauptprogramm wird solange nicht durch GETADC aufgehalten, solange keine Taste gedrückt wird.
    Wurde eine Taste gedrückt, wird in der ISR der Indikator gesetzt und weitere INT0 unterdrückt. Durch den Indikator (Key_pressed) wird dann im Hauptprogramm die WHILE WEND Schleife durchlaufen.

    Dort werden dann immer zwei Messungen solange im Abstand von 20ms gemacht bis die Messungen nahezu gleich sind. Dann wird angenommen, daß eine Taste "gut" gedrückt ist und man kann den Meßwert am Display ausgeben oder sonstwas machen.
    Zum Verlassen der WHILE WEND wird noch die WHILE Bedingung entsprechend gesetzt und INT0 wieder zugelassen.

    Die 20ms Meßabstand, die maximal zulässige Meßdifferenz von 5 und unzulässige Meßwerte (über 500) sind nur ausprobiert und müssen bei Dir eventuell verändert werden.

    Keine Ahnung, ob das für Dich relevant ist; es kann immer nur eine Taste erkannt werden. Wird eine zweite dazu gedrückt, wird das nicht erkannt.

    Den Fall der Meßwerte über 500 müßte man auch nochmal unter die Lupe nehmen.


    Code:
    $hwstack = 48                           'hwstack reichlich wg Interruptroutine
    
    Dim Adc_result As Word
    
    Dim Key_pressed As Byte
    Dim Helper_integer As Integer
    
    Config Adc = Single , Prescaler = Auto
    
    Config Portb.2 = Input
    Config Portb.3 = Input
    Portb.2 = 1
    
    Config Int0 = Falling
    On Int0 Isr_initiate_adc_measure
    
    Enable Int0
    Enable Interrupts
    
    
    Do
    
    While Key_pressed = 1                   'key_pressed wird 1, wenn INT0 aufgetreten ist
       Adc_result = Getadc(3)               '1. Messung
       Helper_integer = Adc_result          '1. Messung zwischenspeichern
       Waitms 20                            'Prellzeit abwarten (20ms experimentell bestimmen)
       Adc_result = Getadc(3)               '2. Messung
       Helper_integer = Helper_integer - Adc_result       'Differenz von erster mit zweiter Messung bilden
       Helper_integer = Abs(helper_integer) '             'positiven Wert der Differenz forcieren
       If Helper_integer < 5 And Adc_result < 500 Then       'Wenn Differenz kleiner 5 ist, dann ist Meßwert stabil (experimentell bestimmen)
                                                             'Manchmal traten Werte beim Loslassen der Taste von über 1000 auf (keine Taste gedrückt),
                                                             'die werden mit Adc_result < 500 unterdrückt
          Gosub Adc_result_to_display       'Zur Auswertung bzw Anzeige von Adc_result
          Key_pressed = 0
          Enable Int0                       'für weiteren Tastendruck INT0 wieder zulassen
       End If
    Wend
    
    'weiter mit Hauptprogramm
    
    Loop
    
    Isr_initiate_adc_measure:
    Disable Int0                            'Weitere Interrupts zB. wg. Prellen erstmal unterdrücken
    Key_pressed = 1                         'Indikator für Hauptprogramm, daß Tastendruck stattgefunden hat
    return

    Gruß
    Searcher
    Geändert von Searcher (27.06.2011 um 17:59 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Dreh-Encoder und Tasten gleichzeitig abfragen
    Von DerSchatten im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 13.05.2011, 20:16
  2. PWM Frage und Interrupt mit Tasten?
    Von Enterprise im Forum C - Programmierung (GCC u.a.)
    Antworten: 24
    Letzter Beitrag: 31.03.2008, 17:16
  3. Pin change Interrupt und Tasten entprellen
    Von Razer im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 16.05.2006, 10:35
  4. Tasten bei RN-control abfragen
    Von christian87 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 26.01.2005, 22:09
  5. Tasten am Rn-Control wie abfragen
    Von FHarry im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 1
    Letzter Beitrag: 30.12.2004, 09:17

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress