Guten Tage en alle. Ich möchte ein Motor von Scheibenwischer mit ein ATtiny 2313 steuern. Das Programme habe ich schon entworfen aber et funktioniert nicht. Hier ist mein Code in ASM. Ich habe versuche mit der Atmelstudio 7 zu simulieren, aber ich kann kein bit manuel setzen und mein Programme bleibe in der Abfrage schleife. ;; ; Scheibenwischer_3.asm ; ; Created: 07.02.2016 10:26:01 ; Author : Claude ; An der Axis der Scheibenwischen ist ein Schleifen en Masse gelegt ; beim Start der Wischen wird dieser Scheifer geöfnet, beim erreichen ; eine Umdrehung, wird die Schleife wieder geschlossen. ; Beim einschalten, sollte der Motor an gehen, ; beim Auschalten sollte er weiter laufen bis die Schleife erreicht ist ; der Schalter besitze 4 Pole, ; 1 Aus ; 2 Klein Geswindigkeit mit Pause (Alternate) ; 3 Klein Geswindigkeit dauer ; 4 Grosse Geswindigkeit dauer ; Benütze wird ein Attiny 2313 ; ; PB = eingänge ; PD = Ausgäng ; PA0 ist der schleife der Motor, ein Round = ein Impulse ; ; Pb5 ist der position schalter Alternance ; PB6 ist der Position Vitesse-1 ; PB7 ist der Position Vitesse-2 ; ; PD 1 Vitesse 1 Alternate (Geswindigkeit 1 mit Pause) ; PD 2 Vitesse 1 ( Geswindigkeit 1 ) ; PD 3 Vitesse 2 ( Geswindigkeit 2 ) ; ;.include "tn26def.inc" .include "tn2313def.inc" .def tmp = r16 .def schleife = r17 .def Schalter = r18 ; Replace with your application code main: /* Initialiesierung */ ldi tmp, 0xFF out DDRB, tmp ; Alle Pins am Porte B in ; Richtungsregister DDRB als Ausgang konfigurieren ldi tmp, 0x00 out DDRD, tmp ; Alle Pins am Port D in ; Richtungsregister DDRD als Eingang konfigurieren abfrag: ; an Port B Werte (Taster) nach schalter einlesen in schalter, PINB cpi schalter, 5 ; ist Alternat PIND 5 gesetzt? breq alternance ; zu Alternence springen ;cpi schalter, 6 ; ist vitesse_1 PIND 6 gesetzt? ;breq vitesse_1 ; zu vitesse 1 springen ;cpi schalter, 7 ; ist vitesse_2 PIND 7 gesetzt? ;breq vitesse_2 ; zu vitesse 2 springen clr Schalter ; schalter_1 löschen rjmp abfrag ; und weiter fragen ;******************************************** ; Pulse ;******************************************** alternance: in schleife, PINA ; Endschleife prüfen cpi schleife, 0b00000001 ; ende Schleife pin = 1 brne alternance ; warten 1 auf pin clr Schleife ; schleife löschen ldi tmp, 0b00000010 ; Motor einschalten out PORTD, tmp ; Motor an weitere: in schleife, PINB ; nochmal prüfen auf 1 sbrs schleife, 4 ; Schleife = 1, stop spring wenn 1 rjmp weitere stop: clr tmp out PORTB, tmp ; Motor aus rcall sekunde2 ; Pause 2 sekunden in schleife, PINA ; Endschleife prüfen cpi schleife, 0b00000001 ; brne alternance ; nochmal in schalter, 5 ; ist immer noch Alternance? BREQ alternance ; weiter machen rjmp main ; zurück zur auswahl weiter: ret /* ;************************************************** ; Vitesse 1 ;*********************************************** vitesse_1: ldi tmp, 0b00000100 ; motor klein geschwindigkeit einschalten out PORTD, tmp ; eingeschaltet in schalter, PINB ; cpi schalter, 6 breq vitesse_1 ret ;************************************************ ; Vitesse_2 ;************************************************ vitesse_2: clr schalter ldi tmp, 0b00001000 ; motor klein geschwindigkeit einschalten out PORTA,tmp ; eingeschaltet in schalter, PINB cpi schalter, 7 breq vitesse_2 ret */ seconde1: ; ============================= ; Warteschleifen-Generator ; 4000 Zyklen: ; ----------------------------- ; warte 3999 Zyklen: ldi r19, $1F WGLOOP0: ldi R20, $2A WGLOOP1: dec R20 brne WGLOOP1 dec R19 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret sekunde2: ; ============================= ; Warteschleifen-Generator ; 8000000 Zyklen: ; ----------------------------- ; warte 7999992 Zyklen: ldi R17, $48 WGLOOP3: ldi R18, $BC WGLOOP4: ldi R19, $C4 WGLOOP5: dec R19 brne WGLOOP5 dec R18 brne WGLOOP4 dec R17 brne WGLOOP3 ; ----------------------------- ; warte 6 Zyklen: ldi R17, $02 WGLOOP6: dec R17 brne WGLOOP6 ; ----------------------------- ; warte 2 Zyklen: nop nop ; =============================
Deine Eingänge und Ausgänge gehen munter durcheinander, Kommentar und Code stimmen nicht überein. Wo wird DDRA gesetzt?
> Scheibenwischer Steuern.
Musst du den Finanzminister auf neue Ideen bringen?
Georg G. schrieb: > Deine Eingänge und Ausgänge gehen munter durcheinander, Kommentar und > Code stimmen nicht überein. Wo wird DDRA gesetzt? Sorry, ich habe etwas korriegiert, und einige vergessen. Die Port A wird um der schleifer ab zu Fragen. Nautilus schrieb: > Warum werden die Timer des AVR nicht genutzt? Um mein Eingäng abzufragen, ich werde sicherlich die Teimer benutzen, aber mein Abfrage funktionier noch nicht, Ich möchte mich damit erst beschäftigen. Aber ich möchte gern die Abfrage der Schleifer über Interrupt, leider ich kenn es mich noch nicht genug aus.
:
Bearbeitet durch User
Hier habe ich das Code corriegiert wieder copiert, ich kann nicht verstehen warum es nicht funktioniert ;; ; Scheibenwischer_3.asm ; ; Created: 07.02.2016 10:26:01 ; Author : Claude ; .include "tn2313def.inc" ; ; PD = eingange ; PB = Ausgang ; PA0 ist der schleife der Motor, ein Round = ein Impulse (Schleife Abfrage) ; ; PD5 ist der position schalter Alternance ; PD6 ist der Position Vitesse-1 ; PD7 ist der Position Vitesse-2 ; ; PB 1 Alternance Ausgang Klein Gewindigkeit Motor an ; PB 2 Vitesse 1 Ausgang Klein gewindigkeit Motor an ; PB 3 Vitesse 2 Ausgang Gross Gewindigkeit Motor an .def tmp = r16 .def schleife = r17 .def Schalter = r18 ; Replace with your application code main: ;*********************************************** ; Initialiesierung ; ; Porte B Ausgänge ; ; Porte D Eingänge ; ; Porte A Eingang ; ;*********************************************** ldi tmp, 0xFF ; Alle Pins am Port B durch Ausgabe von 0xFF ins out DDRB, tmp ; Richtungsregister DDRB als Ausgang konfigurieren out DDRA, tmp ; Eingang für Schleife ldi tmp, 0x00 ; Alle Pins am Port D durch Ausgabe von 0x00 ins out DDRD, tmp ; Richtungsregister DDRD als Eingang konfigurieren ;******************************************* ; Schalterstellungs abfrag ;******************************************* abfrag: in schalter, PINB ; an Port B anliegende Werte (Taster) nach schalter einlesen cpi schalter, 5 ; ist Alternat PIND 5 gesetzt? breq alternance ; Ja, zu Alternence springen cpi schalter, 6 ; Nein, ist vitesse_1 PIND 6 gesetzt? breq vitesse_1 ; Ja zu vitesse 1 springen cpi schalter, 7 ; Nein ist vitesse_2 PIND 7 gesetzt? breq vitesse_2 ; ja zu vitesse 2 springen clr Schalter ; Nein schalter_1 löschen rjmp abfrag ; und weiter fragen ;******************************************** ; Pulse ;******************************************** alternance: in schleife, PINA ; Endschleife prüfen cpi schleife, 0b00000001 ; ist ende Schleife pin = 1 Geschlossen? brne alternance ; Nein, warten 1 auf pinA, Nach fragen clr Schleife ; Ja, schleifenregister löschen ldi tmp, 0b00000010 ; Motor einschalten Klein Gewindigkeite out PORTD, tmp ; Motor an weitere: in schleife, PINB ; nochmal prüfen auf 1 sbrs schleife, 4 ; Schleife = 1, stop spring wenn 1 rjmp weitere ; Nein Nochmal stop: clr tmp ; Ja out PORTB, tmp ; Dann Motor aus rcall warten2s ; Pause 2 sekunden in schleife, PINA ; Endschleife prüfen cpi schleife, 0b00000001 ; Ist es da? brne alternance ; nochmal in schalter, 5 ; ist immer noch Alternance? BREQ alternance ; weiter machen rjmp main ; zurück zur auswahl weiter: ret ;******************************************* ; Vitesse 1 ;******************************************* vitesse_1: ret ;******************************************* ; Vitesse 2 ;******************************************* vitesse_2: ret warten1s: ; ***************************** ; Warteschleifen-Generator ; 4000000 Zyklen: ; ***************************** ; warte 3999996 Zyklen: ldi R19, $24 WGLOOP0: ldi R20, $BC WGLOOP1: ldi R21, $C4 WGLOOP2: dec R21 brne WGLOOP2 dec R20 brne WGLOOP1 dec R19 brne WGLOOP0 ; ***************************** ; warte 3 Zyklen: ldi R19, $01 WGLOOP3: dec R19 brne WGLOOP3 ; ***************************** ; warte 1 Zyklus: nop ; ***************************** ret ; **************************** ; Warteschleifen-Generator ; 8000000 Zyklen: ; **************************** ; warte 7999992 Zyklen: warten2s: ldi R19, $48 WGLOOP4: ldi R20, $BC WGLOOP5: ldi R21, $C4 WGLOOP6: dec R21 brne WGLOOP6 dec R20 brne WGLOOP5 dec R19 brne WGLOOP4 ; ----------------------------- ; warte 6 Zyklen: ldi R19, $02 WGLOOP7: dec R19 brne WGLOOP7 ; ----------------------------- ; warte 2 Zyklen: nop nop ; ============================= ret
Claude B. schrieb: > in schalter, PINB ; an Port B anliegende Werte (Taster) nach > cpi schalter, 5 ; ist Alternat PIND 5 gesetzt? Jeder Pin des Ports setzt ein Bit. Sollte man da nicht besser schreiben cpi schalter, 00100000b (oder wie auch immer dein Assembler das Bit Nummer 5 nennt)? Das stimmt aber nur unter der Voraussetzung, dass dein Taster nach VCC schaltet und ein Pulldown am Eingang verbaut ist. Üblicherweise legt man Taster gegen GND und nutzt den eingebauten Pullup. Dann wäre der Code cpi schalter, 11011111b Dabei haben wir vorausgesetzt, dass im Ruhezustand alle anderen Pins High sind. Noch besser wäre es also, das zu testende Bit allein zu testen. Dein Assembler hat dafür passende Befehle (springe, wenn Bit (nicht) gesetzt ist).
:
Bearbeitet durch User
Georg G. schrieb: > Jeder Pin des Ports setzt ein Bit. Sollte man da nicht besser schreiben > cpi schalter, 00100000b > (oder wie auch immer dein Assembler das Bit Nummer 5 nennt)? > > Das stimmt aber nur unter der Voraussetzung, dass dein Taster nach VCC > schaltet und ein Pulldown am Eingang verbaut ist. Üblicherweise legt man > Taster gegen GND und nutzt den eingebauten Pullup. Dann wäre der Code > cpi schalter, 11011111b > > Dabei haben wir vorausgesetzt, dass im Ruhezustand alle anderen Pins > High sind. Noch besser wäre es also, das zu testende Bit allein zu > testen. Dein Assembler hat dafür passende Befehle (springe, wenn Bit > (nicht) gesetzt ist). Georg, vielen Danke für die Antworte, Anhange Dein Kritiquen, habe ich doch versuche weiter zu machen, Pul-Ups Wiederstände wurden eingesetz, sbrc, sbrs wurden eingesetze, der binär-code wurde nicht überall akzeptiert von der Assembler, (out of range) ;; ; Scheibenwischer_3.asm ; ; Created: 07.02.2016 10:26:01 ; Author : Claude ; .include "tn2313def.inc" ; ; PD = eingange ; PB = Ausgang ; PA0 ist der schleife der Motor, ein Round = ein Impulse (Schleife Abfrage) ; ; PD5 ist der position schalter Alternance ; PD6 ist der Position Vitesse-1 ; PD7 ist der Position Vitesse-2 ; ; PB 1 Vitesse 1 Ausgang Klein Gewindigkeit Motor an ; PB 2 Vitesse 2 Ausgang gross gewindigkeit Motor an ; .def tmp = r16 .def schleife = r17 .def Schalter = r18 ; Replace with your application code main: ;*********************************************** ; Initialiesierung ; ; Porte B Ausgänge ; ; Porte D Eingänge ; ; Porte A Eingang ; ;*********************************************** ldi tmp, 0xFF ; Alle Pins am Port B durch Ausgabe von 0xFF ins out DDRB,tmp ; Richtungsregister DDRB als Ausgang konfigurieren out DDRA,tmp ; Eingang für Schleif ldi tmp, 0xff ; Pull-Ups wiederstände out PORTA,tmp ; einschalten ldi tmp,0x00 ; Alle Pins am Port D durch Ausgabe von 0x00 ins out DDRD,tmp ; Richtungsregister DDRD als Eingang konfigurieren ldi tmp,0xff ; Pull-Ups Wiederstände out PORTD, tmp ; einschalten ;******************************************* ; Schalterstellungs abfrag ;******************************************* abfrag: in schalter, PINB ; an Port B anliegende Werte (Taster) nach schalter einlesen sbrc Schalter, 5; ist Alternat PIND 5 gesetzt? rcall alternance ; Ja, zu Alternence springen sbrc Schalter 6 ; Nein, ist Vitesse 1 PIND 6 gesetzt? rcall Vitesse_1 ; Ja , spring zu vitesse 1 sbrc Schalter, 7 ; Nein, ist vitesse_2 PIND 7 gesetzt? rcall vitesse_2 ; ja zu vitesse 2 springen clr Schalter ; Nein schalter löschen rjmp abfrag ; und weiter fragen ;******************************************** ; Pulse ;******************************************** alternance: ldi tmp, 0b00000010 ; Klein Vitesse out PorteD ; Einschalten in schleife, PINA ; Endschleife prüfen sbrs schleife, 1 ; ist ende Schleife pin = 1 Geschlossen? rcall alternance ; Nein, warten, auf pinA, Nach fragen clr Schleife ; Ja, schleifenregister löschen stop: ldi tmp,1 ; Ja out PORTB, tmp ; Dann Motor aus rcall warten2s ; 2 Sekunden Wartezeit in schalter, PINB ; ist Alternance immer noch da? sbrc PINB, 5 ; jmp Alternance ; Ja, nochmal ret ; Nein, Neue Abfrage in schleife, PINA ; Endschleife prüfen cpi schleife, 0b00000001 ; Ist es da? brne alternance ; neim nochmal fragen in schalter, 5 ; ist immer noch Alternance? BREQ alternance ; weiter machen rjmp main ; zurück zur auswahl weiter: ret ;******************************************* ; Vitesse 1 ;******************************************* vitesse_1: ret ;******************************************* ; Vitesse 2 ;******************************************* vitesse_2: ret ; **************************** ; Warteschleifen-Generator ; 8000000 Zyklen: ; **************************** ; warte 7999992 Zyklen: warten2s: ldi R19, $48 WGLOOP4: ldi R20, $BC WGLOOP5: ldi R21, $C4 WGLOOP6: dec R21 brne WGLOOP6 dec R20 brne WGLOOP5 dec R19 brne WGLOOP4 ; ----------------------------- ; warte 6 Zyklen: ldi R19, $02 WGLOOP7: dec R19 brne WGLOOP7 ; ----------------------------- ; warte 2 Zyklen: nop nop ; ============================= ret
Hi, > ldi tmp, 0xFF ; Alle Pins am Port B durch Ausgabe von 0xFF ins > out DDRB,tmp ; Richtungsregister DDRB als Ausgang konfigurieren > out DDRA,tmp ; Eingang für Schleif wird wohl nicht ganz klappen wenn PA Eingang werden soll. Besser wäre: clr temp out DDRA,tmp ; Eingang für Schleif out DDRD,tmp ; Richtungsregister DDRD als Eingang konfigurieren ldi tmp, 0xff ; Pull-Ups wiederstände out PORTA,tmp ; einschalten out PORTD, tmp ; einschalten out DDRB,tmp ; Richtungsregister DDRB als Ausgang konfigurieren und nun zum bösesten Teil(grün): ;******************************************** ; Pulse ;******************************************** >alternance: ldi tmp, 0b00000010 ; Klein Vitesse out PorteD ; Einschalten in schleife, PINA ; Endschleife prüfen sbrs schleife, 1 ; ist ende Schleife pin = 1 Geschlossen? > rcall alternance ; Nein, warten, auf pinA, Nach fragen rcall benutzt den Stack. 1. nicht initialisiert 2. bei deiner Schreibeweise andauernd bis zum Überlauf->Error benutze bitte rjmp alternance. Auch oben bei der Schalterabfrage wäre rjmp angebracht. Dann aber bitte auch kein ret sondern rjmp abfrag: Der Aufruf >rcall warte... ist aber richtig, die Takte leider nicht weil rcall+ret schon 7 Takte sind. Viel Erfolg, Uwe
hallo Uve Ich habe die correcturen nach dein Anweisungen gemachte, Stackpointer initialiesier. Die Tack stimt wie du sagt nichtmehr, obwohl ist es für dieser project nicht relevant, wurden ausreichen wenn ich von der Runtime 7 Tackt wegnehmen wurde? also der 7 Takt, plus 1 nop ;; ; Scheibenwischer_3.asm ; ; Created: 07.02.2016 10:26:01 ; Author : Claude ; .include "tn2313def.inc" ; ; PD = eingange ; PB = Ausgang ; PA0 ist der schleife der Motor, ein Round = ein Impulse (Schleife Abfrage) ; ; PD5 ist der position schalter Alternance ; PD6 ist der Position Vitesse-1 ; PD7 ist der Position Vitesse-2 ; ; PB 1 Vitesse 1 Ausgang Klein Gewindigkeit Motor an ; PB 2 Vitesse 2 Ausgang gross gewindigkeit Motor an ; .def tmp = r16 .def schleife = r17 .def schalter = r18 ; Replace with your application code main: ;*********************************************** ; Initialiesierung ; ; Porte B Ausgänge ; ; Porte D Eingänge ; ; Porte A Eingang ; ; Init Stapel ; ;*********************************************** ; ldi tmp, LOW(RAMEND) ; Init LSB Stapel out SPL,tmp clr tmp out DDRA,tmp ; Eingang für Schleif out DDRD,tmp ; Richtungsregister DDRD als Eingang konfigurieren ldi tmp, 0xff ; Pull-Ups wiederstände out PORTA,tmp ; einschalten out PORTD, tmp ; einschalten out DDRB,tmp ; Richtungsregister DDRB als Ausgang konfigurieren ;******************************************* ; Schalterstellungs abfrag ;******************************************* abfrag: in schalter, PINB; an Port B anliegende Werte (Taster) nach schalter einlesen sbrc schalter, 5 ; ist Alternat PIND 5 gesetzt? rcall alternance ; Ja, zu Alternence springen sbrc schalter, 6 ; Nein, ist Vitesse 1 PIND 6 gesetzt? rcall Vitesse_1 ; Ja , spring zu vitesse 1 sbrc schalter, 7 ; Nein, ist vitesse_2 PIND 7 gesetzt? rcall vitesse_2 ; ja zu vitesse 2 springen clr schalter ; Nein schalter löschen rjmp abfrag ; und weiter fragen ;******************************************** ; Pulse ;******************************************** alternance: ldi tmp, 0b11111101 ; Klein Vitesse out PortD, tmp ; Einschalten in schleife, PINA ; Endschleife prüfen sbrs schleife, 2 ; ist ende Schleife pin = 1 Geschlossen? rjmp alternance ; Nein, warten, auf pinA, Nach fragen clr Schleife ; Ja, schleifenregister löschen stop: ldi tmp,1 ; out PORTB, tmp ; Dann Motor aus rcall warten2s ; 2 Sekunden Wartezeit in schalter, PINB ; ist Alternance immer noch da? sbrc PINB, schalter ; rjmp Alternance ; Ja, nochmal rjmp abfrag ; Nein, Neue Abfrage in schleife, PINA ; Endschleife prüfen cpi schleife, 0b11111101 ; Ist es da? brne alternance ; neim nochmal fragen in schalter, 5 ; ist immer noch Alternance? BREQ alternance ; weiter machen rjmp main ; zurück zur auswahl ;******************************************* ; Vitesse 1 ;******************************************* vitesse_1: ldi tmp, 0b11111101 ; Klein Vitesse pin 1 out PortD, tmp ; einschalten in schleife, PINA ; Endschleife prüfen sbrs schleife, 1 ; ist ende Schleife pin = 1 Geschlossen? rcall vitesse_1 ; Nein, warten, auf pinA, Nach fragen clr Schleife ; Ja, schleifenregister löschen ldi tmp, 0b11111101 ; out PortD, tmp ; Motor ausschalten ret ;******************************************* ; Vitesse 2 ;******************************************* vitesse_2: ret ; **************************** ; Warteschleifen-Generator ; 8000000 Zyklen: ; **************************** ; warte 7999992 Zyklen: warten2s: ldi R19, $48 ; stat $48, $41 WGLOOP4: ldi R20, $BC WGLOOP5: ldi R21, $C4 WGLOOP6: dec R21 brne WGLOOP6 dec R20 brne WGLOOP5 dec R19 brne WGLOOP4 ; ----------------------------- ; warte 6 Zyklen: ; ldi R19, $02 ;WGLOOP7: dec R19 ; brne WGLOOP7 ; ----------------------------- ; warte 2 Zyklen: ; nop nop ; ============================= ret
Hi, du hast ein furchtbares Chaos bei den Ein/Ausgängen ---------------------------------------------- > ldi tmp, 0b11111101 ; Klein Vitesse > out PortD, tmp ; Einschalten > ldi tmp,1 ; > out PORTB, tmp ; Dann Motor aus ------------------------------------------------ > ldi tmp, 0b11111101 ; Klein Vitesse pin 1 > out PortD, tmp ; einschalten > ldi tmp, 0b11111101 ; > out PortD, tmp ; Motor ausschalten -------------------------------------------- >Die Tack stimt wie du sagt nichtmehr, obwohl ist es für dieser project >nicht relevant doch, rcall+ret benutzen Stack für Rücksprungadresse. Ich würde ja Timer benutzen und so einige Dinge anders machen, aber habe das Progr. mal nach deiner Schreibweise umgestaltet. ################################################################### ; Benütze wird ein Attiny 2313 ; ; PA0 ist der schleife der Motor, ein Round = ein Impulse ; ; PB = eingänge ; Pb5 ist der position schalter Alternance ; PB6 ist der Position Vitesse-1 ; PB7 ist der Position Vitesse-2 ; ; PD = Ausgäng ; PD 1 Vitesse 1 Alternate (Geswindigkeit 1 mit Pause) ; PD 2 Vitesse 1 ( Geswindigkeit 1 ) ; PD 3 Vitesse 2 ( Geswindigkeit 2 ) ; ;.include "tn26def.inc" .include "tn2313def.inc" .def tmp = r16 .def schleife = r17 .def Schalter = r18 #define Mot_Out PortD #define Vitesse_1 PD1 ;( Geswindigkeit 1 ) #define Vitesse_2 PD2 ;( Geswindigkeit 2 ) #define errorLed PD3 ;an wenn low ->Motor dreht nicht(Schleifer bleibt auf GND) /kein def.Halt löschen mit Schalter=0 #define Motor_in PinA #define Mot_Stop PA0 ;ist der schleife der Motor, ein Round = ein Impulse #define Schalter PinB ;(Schalter gehen nach GND!) #define VT_1A PB5 ;ist der position schalter Alternance #define VT_1 PB6 ;ist der Position Vitesse-1 #define VT_2 PB7 ;ist der Position Vitesse-2 Init: ldi tmp, LOW(RAMEND) ; out SPL,tmp ;Init Stack clr tmp out DDRA,tmp ; Eingang für Schleif out DDRD,tmp ; Richtungsregister DDRD als Eingang konfigurieren out Mot_out,tmp ldi tmp, 0xff ; Pull-Ups wiederstände out PORTA,tmp ; einschalten out PORTD, tmp ; einschalten out DDRB,tmp ; Richtungsregister DDRB als Ausgang konfigurieren sbi Mot_out,errorLed ; Fehlerled aus HP: sbis Schalter,VT_1A rjmp alternance sbis Schalter,VT1 rjmp vitesse_1 sbis Schalter,VT2 rjmp vitesse_2 sbi Mot_out,errorLed ;Fehlerled aus rcall MotAus ;kein Schalter rjmp HP ;+++++++++++++++++++++++++++ alternance: sbis Mot_out,errorLed ;Fehlerled aus? rjmp HP ; ldi tmp,13 ;ca 200ms rcall Zeit_1 sbic Schalter,VT_1A ;Fehler? rjmp HP ;ja sbi Mot_Out,Vitesse_1 ;Motor Start slow ldi tmp,15 ;ca 250ms rcall Zeit_1 sbis Motor_in,Mot_Stop jmp Fehler ;Motor dreht nicht ldi tmp,122 ;ca 2sek rcall Zeit_1 rcall MotAus ldi tmp,122 ;ca 2sek rcall Zeit_1 rjmp HP ;+++++++++++++++++++++++++++ vitesse_1: sbic Mot_Out,Vitesse_1 rjmp HP ;ist schon an sbis Mot_out,errorLed ;Fehlerled aus? rjmp HP ; ldi tmp,13 ;ca 200ms rcall Zeit_1 sbic Schalter,VT_1 ;Fehler? rjmp HP ;ja sbi Mot_Out,Vitesse_1 ;Motor Start slow ldi tmp,15 ;ca 250ms rcall Zeit_1 sbis Motor_in,Mot_Stop rjmp Fehler ;Motor dreht nicht rjmp HP ;ja ;+++++++++++++++++++++++++++++ vitesse_2: sbic Mot_Out,Vitesse_2 rjmp HP ;ist schon an sbis Mot_out,errorLed ;Fehlerled aus? rjmp HP ; ldi tmp,13 ;ca 200ms rcall Zeit_1 sbic Schalter,VT_2 ;Fehler? rjmp HP ;ja sbi Mot_Out,Vitesse_2 ;Motor Start fast ldi tmp,15 ;ca 250ms rcall Zeit_1 sbis Motor_in,Mot_Stop rjmp Fehler ;Motor dreht nicht rjmp HP ;ja ++++++++++++++++++++++++++++ Fehler: cbi Mot_out,errorLed ;Timeout, Fehlerled an cbi Mot_Out,Vitesse_1 cbi Mot_Out,Vitesse_2 rjmp HP ;+++++++++++++++++++++++++++ MotAus: ldi tmp,100 ;Timeout max 1,64s bis Stop E_Stop: sbic Motor_in,Mot_Stop ;aller 16,4ms rjmp Mot_0 rcall Time16 tst tmp brne E_Stop cbi Mot_out,errorLed ;Timeout, Fehlerled an Mot_0: cbi Mot_Out,Vitesse_1 cbi Mot_Out,Vitesse_2 ret ;+++++++++++++++++++++++++++ ;Multiplikator für 16,4ms kommt in tmp (max 255= 4,18s) Zeit1: tst tmp breq Zeit_E rcall Time16 rjmp Zeit1 Zeit_E: ret ;+++++++++++++++++++++++++++ Time16: ldi R20,$FF LOOP1: ldi R21,$FF LOOP2: dec R21 brne LOOP2 dec R20 brne LOOP1 dec tmp ret ;+++++++++++++++++++++++++++ Viel Erfolg,Uwe
so ein Mist, selber Ports vertauscht bitte ändern: clr tmp out DDRA,tmp ; Eingang für Schleif out DDRB,tmp ; Richtungsregister DDRB als Eingang konfigurieren out Mot_out,tmp ldi tmp, 0xff ; Pull-Ups wiederstände out DDRD,tmp ; Richtungsregister DDRD als Ausgang konfigurieren out PORTA,tmp ; einschalten out PORTB,tmp ; einschalten sbi Mot_out,errorLed ; Fehlerled aus viel Erfolg, Uwe
Claude B. schrieb: > Ich möchte ein Motor von Scheibenwischer mit ein ATtiny 2313 steuern. > Das Programme habe ich schon entworfen aber et funktioniert nicht. Wozu soll das gut sein?
Hallo Uwe, Danke für dein Mühe, comme du erkennen kann, ich bin ein kleine Anfänger, und möchte mich nur verbessern. Vielleicht war dieser Projekt für mich ein bisschen zu hohe. Wenn ich gut verstanden habe, die 200ms bzw. 250 sind da für die Prellung der Tasten oder?. Hallo Mani, was das ganz solle ein Scheibenwischen ansteuern, der Scheibenw. hat ein schleife die nach ein Rund auf mass gelegt wird, der Moteur hat 2 geschwindigkeit. Mein ide war mit eien Viestufigschalter 1: Stop 2: klein geschwindigkeit, mit pause 3: klein geschwindigkeit in kontinue 4: Grosse Geschwindigkeit , in kontinue 5. für mich auch lerneffekt. Mein nächte aufgabe, die schleife mit interrupt ab zu fragen, und ein Teimer für die Einstelbare Pause. Vielen danke an Uve und die Andere die mich geholfen haben
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.