mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Counter


Autor: Marcel Block (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

hier erstmal der quellcode:
.include "4433def.inc"

; ---------------
; -- c<onstants --
; ---------------
.def   temp   = r16
.def  counter = r17
.def  time   = r18
.def  one   = r19
.def  zero   = r20

; ---------------------
; -- interrupt-table --
; ---------------------
.cseg
.org  $000
  rjmp  reset    ; reset interrupt
.cseg
.org  OVF0addr      
  rjmp  int_timer0   ; timer0 overflow interrupt
    
reset:  rjmp  init

; -----------------------
; -- interrupt-handler --
; -----------------------
int_timer0:  
  inc  counter
  cpse  counter, one
  reti        
  rjmp  count_0
count_0:
  ldi  counter, 0
  reti

; --------------------
; -- initialization --
; --------------------
init:
  ldi   r16, RAMEND   ; initialize the stack
  out   SPL, r16
  
  sei       ; enable interrupts  
  
        ldi   r16, 0xFF   ; PortB is output
        out   DDRB, r16
         
        ldi   r16, 0x00   ; PortD is input
        out   DDRD, r16

  ldi   one, 255   ; set some constans
  ldi   zero, 0
    
timer:
  ldi   counter, 0

  ldi  temp,timsk   ; init the register timsk
  ori  temp,0b00000010  
  out  timsk,temp    

  ldi  temp,tccr0   ; start Timer0 with
  ldi  temp,0b00000011 ; 1/64
  out  tccr0,temp    
      
  rjmp  loop
  
; ---------------------
; -- usefull methods --
; ---------------------
wait:  ldi  counter, 0
  ldi  time, 100
  rjmp  count
count:  
  cpse  counter, time  ; skip if we have 100 timer-overflows
  rjmp  count
  ret

; ---------------
; -- main-loop --
; ---------------
loop:    
  ldi   temp, 0b00000001
  out   PORTB, temp
  rcall   wait
  
  ldi  temp, 0b00000000
  out  PORTB, temp  
  rcall   wait
  
  ldi   temp, 0b00000010
  out   PORTB, temp
  rcall   wait
  
  ldi  temp, 0b00000000
  out  PORTB, temp
  rcall   wait
  
  rjmp   loop
  
; -----------------
; -- other stuff --
; -----------------

komischerweiße bleibt das programm beim ersten "rcall wait" einfach 
stehen und macht nix mehr.
ABER jetzt kommt das komische: wenn ich die stromzufuhr ganz kurz 
unterbreche und dann wieder herstelle dann funktioniert die schaltung 
auf einmal

habt ihr ne idee woran das liegen könnte?

MFG Marcel

Autor: Marcel Block (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner ne idee?

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Der Fehler sollte im Timerinit stecken.
Du schreibst:
timer:
  ldi counter, 0

  ldi temp,timsk ; init the register timsk
  ori temp,0b00000010
  out timsk,temp

TIMSK hat $39 + dein ori $2 =$3b
Damit wird TICIE1 + TOIE0 eingeschaltet, aber TICIE1 hat keine
ISR_adresse. Der Programmzeiger springt also irgendwo ins Progr.
Du wolltest vermutlich
in temp,timsk ; init the register timsk
schreiben, das könnte gehen. Aber warum diesen Aufwand?

ldi temp,$2
out timsk,temp

bewirkt das selbe.

ldi temp,tccr0 ; start Timer0 with
und
; -----------------------
; -- interrupt-handler --
; -----------------------

  rjmp count_0
count_0:

Ist auch unsinnig

Gruss Uwe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.