Autor
|
Thema: Taster als Schalter via AVR (Gelesen 152126 mal)
|
Fabeulous
Gast
|
Oh yoa das fällt mir gerade auch mal auf das der garnicht aktiviert war! Danke für den Tip! Dann denke ich mal das es daran liegt! Ich werde das nächste Woche mal ausprobieren... Danke!
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
So ich habe eure tips befolgt und nun funktioniert es! Also es lag an dem ISP der immer noch angesteckt war und daran das ich bei einem PIN vergessen habe den Pull Up Widerstand zu aktivieren.
Ich habe jetzt auch noch eine Version mit Flankenerkennung gebastelt. Also ohne Autorepeat. Ein paar "Treiberleichen" von der noch geplanten Kommunikation per UART sind aber noch drin...
.include "m8def.inc" .def temp1   = r16 .def temp2 = r17 .def tast_neu = r18 .def tast_alt = r19 .def temp_send = r20 .def alter_taster_status= r21
.equ F_CPU = 8000000    ; Systemtakt in Hz .equ BAUD = 9600      ; Baudrate ; Berechnungen .equ UBRR_VAL  = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1)))   ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))    ; max. +/-10 Promille Fehler  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif
ldi  temp1, 0b00111111 ;PORTC -> Ausgang out  DDRC, temp1
ldi  temp1, 0b00011111 ;PORTB -> Pull-Up Widerstände ein out  PORTB, temp1
ldi  temp1, 0b00001100 ;PORTD -> Ausgang und Eingang out  DDRD, temp1
ldi  temp1, 0b11100000 ;PORTD -> Pull-Up Widerstände ein out  PORTD, temp1
ldi   tast_alt, 0b11111111 ; Baudrate einstellen     ldi temp1, HIGH(UBRR_VAL)     out UBRRH, temp1     ldi temp1, LOW(UBRR_VAL)     out UBRRL, temp1
; Frame-Format: 8 Bit
    ldi temp1, (1<<URSEL)|(3<<UCSZ0)     out UCSRC, temp1     sbi UCSRB,TXEN
warten:
ldi temp_send, 'A'     out UDR, temp_send serout:     sbis UCSRA,UDRE          ; Warten bis UDR für das nächste                      ; Byte bereit ist     rjmp serout ldi temp1, $FF       ; ein bisschen warten ... wait1:    ldi temp2, $FF wait2:    dec temp2    brne wait2    dec temp1    brne wait1
haupt:
       in  alter_taster_status, PIND       ; PIND -> temp1 (11100000)       andi alter_taster_status, 0b11100000       in  temp1, PINB       ; PINB -> temp2 (00011111)       andi temp1, 0b00011111        or  alter_taster_status, temp1     ; 11100000(temp1) und 00011111(temp2) = 11111111(temp1)
sbic PIND, 7 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke schleife_1 rjmp schleife_1 sbrs alter_taster_status, 7 rjmp schleife_1
pruefen_0: sbis PORTD, 2 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_0 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_0 ; Wenn es 1 ist tu das(Ausschalten)
an_0: sbi PORTD, 2 ; Einschalten :P rjmp warten aus_0: cbi PORTD, 2 ; Ausschalten :P rjmp warten
schleife_1: sbic PIND, 6 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D rjmp schleife_2 sbrs alter_taster_status, 6 rjmp schleife_2
pruefen_1: sbis PORTD, 3 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_1 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_1 ; Wenn es 1 ist tu das(Ausschalten)
an_1: sbi PORTD, 3 ; Einschalten :P rjmp warten aus_1: cbi PORTD, 3 ; Ausschalten :P rjmp warten schleife_2: sbic PIND, 5 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D rjmp schleife_3 sbrs alter_taster_status, 5 rjmp schleife_3
pruefen_2: sbis PORTC, 0 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_2 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_2 ; Wenn es 1 ist tu das(Ausschalten)
an_2: sbi PORTC, 0 ; Einschalten :P rjmp warten aus_2: cbi PORTC, 0 ; Ausschalten :P rjmp warten
schleife_3: sbic PINB, 4 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D rjmp schleife_4 sbrs alter_taster_status, 4 rjmp schleife_4
pruefen_3: sbis PORTC, 1 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_3 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_3 ; Wenn es 1 ist tu das(Ausschalten)
an_3: sbi PORTC, 1 ; Einschalten :P rjmp warten aus_3: cbi PORTC, 1 ; Ausschalten :P rjmp warten
schleife_4: sbic PINB, 3 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D rjmp schleife_5 sbrs alter_taster_status, 3 rjmp schleife_5
pruefen_4: sbis PORTC, 2 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_4 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_4 ; Wenn es 1 ist tu das(Ausschalten)
an_4: sbi PORTC, 2 ; Einschalten :P rjmp warten aus_4: cbi PORTC, 2 ; Ausschalten :P rjmp warten
schleife_5: sbic PINB, 2 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D rjmp schleife_6 sbrs alter_taster_status, 2 rjmp schleife_6
pruefen_5: sbis PORTC, 3 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_5 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_5 ; Wenn es 1 ist tu das(Ausschalten)
an_5: sbi PORTC, 3 ; Einschalten :P rjmp warten aus_5: cbi PORTC, 3 ; Ausschalten :P rjmp warten
schleife_6: sbic PINB, 1 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D rjmp schleife_7 sbrs alter_taster_status, 1 rjmp schleife_7
pruefen_6: sbis PORTC, 4 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_6 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_6 ; Wenn es 1 ist tu das(Ausschalten)
an_6: sbi PORTC, 4 ; Einschalten :P rjmp warten aus_6: cbi PORTC, 4 ; Ausschalten :P rjmp warten
schleife_7: sbic PINB, 0 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D rjmp haupt sbrs alter_taster_status, 0 rjmp haupt
pruefen_7: sbis PORTC, 5 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist rjmp an_7 ; Wenn es 0 ist tu das(Einschalten) rjmp aus_7 ; Wenn es 1 ist tu das(Ausschalten)
an_7: sbi PORTC, 5 ; Einschalten :P rjmp haupt aus_7: cbi PORTC, 5 ; Ausschalten :P
   rjmp haupt
EDIT: Die kommentare im Code bitte ignorieren. Teilweise stimmen diese nicht bzw. ich hatte noch keine Zeit diese zu korrigieren!
EDIT SE: So ich versuche gerade die Komuniktaion über UART. Kann es sein das dank eines rs232 Verlängerungskabels die Kommuniktaion nicht funktioniert? Sowohl meine Version als auch das Testprogramm von Mikroknotroller.net sind nciht in der Lage irgendwas an den PC zu schicken... Hat jemand noch ideen woran das liegen könnte?
|
|
« Letzte Änderung: November 18, 2007, 14:49:58 von Fabeulous »
|
Gespeichert
|
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
hastn schaltplan?
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
Schaltplan: http://fabeulousde.h198298.ser...Schaltplan3.png
Und das ganze lief ja schonmal. Den MAX232 habe ich auch schon ausgetauscht. Der µC ist per Flachbandkabel mit dem Rechner verbunden bzw. dazwischen hängt ja noch das Verlängerungskabel. Ich verstehe einfach nciht warum es nicht klappt. Es lief ja schonmal und nun empfängt er garnichts mehr...
|
|
|
Gespeichert
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
erstmal gucken ob baudrate usw alle richtig eingestellt sind wobei da bei kleinen fehlern trotzdem irgendein kaudawelch ankommen müsste. dann die leitungen checken. Spannungen am max prüfen und auf den com-leitungen. wenn bei mir nix geht nehm ich als n 2. AVR und reduzier das programm auf die relevanten programmteile und teste es damit.
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
Ich habe exakt diesen Code zum testen Benutzt:
.include "m8def.inc" .def temp = r16 .equ F_CPU = 8000000 ; Systemtakt in Hz .equ BAUD = 9600 ; Baudrate ; Berechnungen .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ; Baudrate einstellen ldi temp, HIGH(UBRR_VAL) out UBRRH, temp ldi temp, LOW(UBRR_VAL) out UBRRL, temp ; Frame-Format: 8 Bit ldi temp, (1<<URSEL)|(3<<UCSZ0) out UCSRC, temp sbi UCSRB,TXEN ; TX aktivieren loop: ldi temp, 'T' rcall serout ; Unterprogramm aufrufen ldi temp, 'e' rcall serout ; Unterprogramm aufrufen ldi temp, 's' rcall serout ; ... ldi temp, 't' rcall serout ldi temp, '!' rcall serout ldi temp, 10 rcall serout ldi temp, 13 rcall serout rjmp loop serout: sbis UCSRA,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR, temp ret ; zurück zum Hauptprogramm Leider kam nichts an! muss ich den Rechner jedes mal neu starten wenn ich am com port was neues anschließe? ich habe nämlich nur einen und wechsel immer zwischen ISP und UART... Vlt. liegt das daran ich meine rs232 unterstützt kein plug and play oder?
|
|
|
Gespeichert
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
was ist denn ISP? Nein ein Comport interessiert eigneltich nicht ob an ihm was angeschlossen ist oder nicht. Afaik prüft entsprechende Hard- und Software über eigene Steuersignale nach ob das richtige Gerät angeschlossen ist. Bei deinem Terminal ist das nicht der fall. Welches Terminalprogramm benutzt du denn?
mfg PoWl
|
|
|
Gespeichert
|
|
|
|
Reisi
Lötkolbenfreak

Karma: +2/-0
Offline
Beiträge: 190
|
Die häufigste Fehlerursache beim UART hat immer was mit dem Takt zu tun. Was für eine Taktquelle hast du denn momentan?
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
Mein ISP wird auch über rs232 augesteuert und ich muss halt immer zwischen dem ISP und dem MIkrocontrolelr wechseln...
Ich benutze als Taktquelle ein 8 Mhz Quarz. Als Terminal Programm habe ich Hyperterminal.
|
|
|
Gespeichert
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
ach ISP.. ja jetzt hab ichs gerafft.. also mal abgesehen von der Problematik, probier doch mal HTerm, finde das isn super programm!
lg PoWl
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
Geil. Erstmal danke für das programm. ich hab mir schon seit längerem gedacht das es doch auch was moderneres als Hyperterminal geben muss...  Vor allendingen kann man damit auch senden oder? Also zumindest habe ich meiner minung nach direkt verstanden wie 
Ach damit euch nicht langweilig wird hab ich mal ein paar Bilder gemacht:
 Mein kleiner Arbeitsplatz 
 Die Hauptplatine
 Das ist die Platine an die die Taster angeschlossen sind welche dann per Flachbandkabel mit dem µC verbunden sind - Was man eigentlich auch sehen kann 
Ich mache euch jetzt auch nochmal ein kleines Bilderbuchbild um das mit dem ISp nochmal zu erläutern...
EDIT: Da fehlt natürlich noch die Relaisplatine. Aber ich will euch ja nicht schon alles zeigen.. außerdem hab ich die Kamera gerade wieder eingepackt 
Hier mein kleines Bildchen ich hoffe ihr wisst nun was ich meinte. Sorry für die Schelchte Pain bearbeitung...

|
|
« Letzte Änderung: November 22, 2007, 17:00:08 von Fabeulous »
|
Gespeichert
|
|
|
|
PoWl
Dremelfreund

Karma: +0/-0
Offline
Beiträge: 140
Atmel AVR Mikrocontroller
|
Krasse Schaltung :-D
Bleiben die kleinen Tasterchen bei dir im Steckboard? Meine Springen immer raus, hab dazu die beinchen um 90° gedreht (gebogen)
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
Danke danke  Ja mittlerweile schon. Also die Beinchen waren ja von beginn an ein bischen gekrümmt. Ich vermute damit sie sich in die eigentliche Platine einhaken. Ich hab die Beine dann einfach gerade gemacht und nun blieben sie Stecken. Aber auch nur wenn man sie sanft dazu zwingt...
|
|
|
Gespeichert
|
|
|
|
Fabeulous
Gast
|
So nochmal danke für HTERm. Damit empfängt mein PC nämlich was. Wie darf man denn das Prgramm verstehen?
Ich habe das folgende Bild folgendermaßen interpretiert:
 Diese 12 Fächer(Welche so ein bischen aussehen wie eine Tabelle) zeigen die letzten 12 empfangenen bytes an richtig?
Pro byte sind die werte in Ascci, Hex, Dec, und Bin angegeben(deswegen auch die verschiedenfarbigen Zeilen) richtig?
|
|
« Letzte Änderung: November 22, 2007, 17:12:28 von Fabeulous »
|
Gespeichert
|
|
|
|
|