Forum: Mikrocontroller und Digitale Elektronik Scheibenwischer Steuern.


von Claude B. (claude44)


Lesenswert?

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
; =============================

von Georg G. (df2au)


Lesenswert?

Deine Eingänge und Ausgänge gehen munter durcheinander, Kommentar und 
Code stimmen nicht überein. Wo wird DDRA gesetzt?

von Bernd (Gast)


Lesenswert?

> Scheibenwischer Steuern.

Musst du den Finanzminister auf neue Ideen bringen?

von Nautilus (Gast)


Lesenswert?

Warum werden die Timer des AVR nicht genutzt?

von Claude B. (claude44)


Lesenswert?

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
von Claude B. (claude44)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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
von Claude B. (claude44)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Claude B. (claude44)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Mani W. (e-doc)


Lesenswert?

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?

von Claude B. (claude44)


Lesenswert?

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
Noch kein Account? Hier anmelden.