Forum: Mikrocontroller und Digitale Elektronik Atiny 2313 timerinterupt


von Claude B. (claude44)


Lesenswert?

Guten Tag an alle
Ich gerade dabei mir die assemblersprache bei zu bringen und als 
anfänger möchte ich dieser kleine Programme zum laufen zu bringen. 
Leider habe ich irgendwo ein Fehler gemacht, es möchte nicht laufen. 
Kann mir jemand erclären wie das gehen soll. Danke
das ist wie im Titel gesagt, ein Atiny 2313. Dieser Programme soll ein 
LED alle 0,5secunde blicken lassen.

Hier ist der Code
 /*************************************************
  *  Initialiesierung Zuweisung
  *************************************************/
  .include "tn2313def.inc"

  .def  Direction  = r16
  .def  temp    = r17
  .def  loopcount  = r18

  ; ==============================================
  ;   Interupts
  ; ==============================================
;
.CSEG
.ORG $0000

 rjmp Main

.ORG OVF0addr
  rjmp TIMER0_COMPA_vect


  /**********************************************************
  *          Loopcount 125  Timer Interrupt Initialiesierung
  ***********************************************************/

  Main:
   ldi temp,low(RAMEND)
   out SPL,temp

   ldi Direction, 0b00100000
   out DDRD,  Direction

   ldi loopcount, 0

   ldi  temp,  125
   out OCR0A, temp

   ldi temp, ( 1 << WGM02 ) | ( 1 << CS02 )
   out TCCR0B, temp

   ldi temp, (1 << OCIE0A)
   out TIMSK, temp

   sei
loop:
   rjmp loop

TIMER0_COMPA_vect:

   inc loopcount
   cpi  loopcount, 125
   brne Ende
   ldi  loopcount, 0
   in   temp, PORTD
   eor  temp, Direction
   out  PORTD, temp

Ende:
   reti

von Ralf G. (ralg)


Lesenswert?

Claude B. schrieb:
> .ORG OVF0addr
>   rjmp TIMER0_COMPA_vect

'OVF0addr' klingt so nach Timer0-Overflow. Dafür gibt's aber keine 
Freigabe. Du hast den 'Timer/Counter0 Compare Match A' freigegeben und 
der möchte an $000D eingetragen werden.

von Claude B. (claude44)


Lesenswert?

guten abend Ralf, und Danke für dein Antworte,

der "OVF0addr" ist der Overflow interrupt

du hast geschrieben
"Du hast den 'Timer/Counter0 Compare Match A' freigegeben und
der möchte an $000D eingetragen werden." ich bin da überfordet

Vielleicht kannst du mir erklären wie ich mein Fehler aufheben kann? wie 
gesagt, ich bin un klein Anfänger, ich möchte lernen. Danke

von Pastor Braune (Gast)


Lesenswert?

erstmal Tutorial lesen
dann versuchen das Datenblatt zu lesen/verstehen
dann kommt man vielleicht selbst auf die Fehler die man gemacht hat

1. die Interupt Vectoren
1
 ; ==============================================
2
  ;   Interupts
3
  ; ==============================================
4
;
5
6
.org 0x000
7
         rjmp main            ; Reset Handler
8
.org OC0Aaddr
9
   rjmp TIMER0_COMPA_vect
10
11
12
13
  /**********************************************************
14
  *          Loopcount 125  Timer Interrupt Initialiesierung

org 0 rjmp main hat gefehlt
und timer0 falsch

2. die entsprechenden bit positionen befinden sich in zwei Register
1
   ldi temp, ( 1 << WGM01 ) 
2
    out TCCR0A, temp
3
  ldi temp, ( 1 << CS02 )
4
     out TCCR0B, temp

mfg

von Claude B. (claude44)


Lesenswert?

einschuldigung, ich verstehe nicht ganz ich habe :

ldi temp,125-1
out OCCR0A, temp geladen mit 125-1

dann nach dein Aussage, kommt

ldi temp(1<<WG01)
out TCCROA,temp

ich überschreib doch TCCR0A oder habe ich falsch verstanden, weil dann

ldi  temp, ( 1 << C02)
out  TCCR0B, temp
....

von Pastor Braune (Gast)


Lesenswert?

das ist falsch !

 ldi temp, ( 1 << WGM02 ) | ( 1 << CS02 )
 out TCCR0B, temp

da sich WGM02 und CS02 in unterschiedlichen Registern befinden

einmal in TCCR0A und einmal in TCCR0B

folglich ist es so richtig =

  ldi temp, ( 1 << WGM01 )
    out TCCR0A, temp
  ldi temp, ( 1 << CS02 )
     out TCCR0B, temp

schau in dein Datenblatt vom 2313

von Claude B. (claude44)


Lesenswert?

Vielen dank für Dein Antworte,die ist mir sehr hilfsreich
 mit der Datenblatte, habe ich einige Problème zu verstehen.

Ich probiere das ganz wieder von vorn und ich melde mich,
Vielendanke nochmal

von Pastor Braune (Gast)


Lesenswert?

was vergessen
WGM02 alleine zu setzen ist falsch

Table 40. Waveform Generation Mode Bit Description

Mode  WGM2     WGM1    WGM0
4   1   0   0   Reserve

von Pastor Braune (Gast)


Lesenswert?

Das sollte funktionieren :
1
 /*************************************************
2
  *  Initialiesierung Zuweisung
3
  *************************************************/
4
  .include "tn2313def.inc"
5
6
  .def  Direction  = r16
7
  .def  temp    = r17
8
  .def  loopcount  = r18
9
10
  ; ==============================================
11
  ;   Interupts
12
  ; ==============================================
13
;
14
15
.org 0x000
16
         rjmp main            ; Reset Handler
17
.org OC0Aaddr
18
   rjmp TIMER0_COMPA_vect
19
20
21
22
  /**********************************************************
23
  *          Loopcount 125  Timer Interrupt Initialiesierung
24
  ***********************************************************/
25
26
  Main:
27
   ldi temp,low(RAMEND)
28
   out SPL,temp
29
30
   ldi Direction, 0b00100000
31
   out DDRD,  Direction
32
33
   ldi loopcount, 0
34
35
   ldi  temp,  125
36
   out OCR0A, temp
37
38
     ldi temp, ( 1 << WGM01 ) 
39
    out TCCR0A, temp
40
  ldi temp, ( 1 << CS02 )
41
     out TCCR0B, temp
42
  
43
  
44
   ldi temp, (1 << OCIE0A)
45
   out TIMSK, temp
46
47
   sei
48
loop:
49
   rjmp loop
50
51
TIMER0_COMPA_vect:
52
53
   inc loopcount
54
   cpi  loopcount, 125
55
   brne Ende
56
   ldi  loopcount, 0
57
   in   temp, PORTD
58
   eor  temp, Direction
59
   out  PORTD, temp
60
61
Ende:
62
   reti

von Claude B. (claude44)


Lesenswert?

Vielen Danke Pasteur Braun

Ich habe gerade überprüft, ich habe das Gleich aber es will nicht 
blinken. ich erwartet ein blink zeit von 0,5 secunde.
Ich habe dieser Programme übernommen von:
http://www.henrykoch.de/pages/programmieren/Pollin_Evaluations_Board/Pollin_Board_mit_ATTiny2313_blinkende_LED_mit_Timer.php

das ich weiter einwickel möchte

von Pastor Braune (Gast)


Lesenswert?

Das funktioniert im Simulator vom Atmelstudio 4.18 genauso wie im Studio 
7
und auch in real auf einem Testboard .
Mit 8 Mhz internem Takt sollte deine Blinkzeit ungefähr stimmen
(Bei Auslieferung ist die CKDIV8 Fuse gesetzt der Takt beträgt 1 Mhz 
dann ist die Blinkzeit entsprechend grösser)

Überprüfe deinen Aufbau
Ist die LED am richtigen Pin angeschlossen
Ist die LED vielleicht verkehrt rum angeschlossen
usw usw

mfg

von Claude B. (claude44)


Lesenswert?

Guten Tag

Ich Arbeitet mit STK 500. und ATMELSTUDIO 6.2


ich habe gerade ein copie paste von dein code, es funktioniere, aber zu 
langsam. wie kann ich wissen die einstellung der Frequanz, wie kanne ich 
die ändern?

Ich werde natürlich nochmal prüfen wo mein Fehler ligt
vielen dank

von Pastor Braune (Gast)


Lesenswert?

Datenblatt Seite 24 - System Clock and Clock Options

Default Clock Source
The device is shipped with CKSEL = “0100”, SUT = “10”, and CKDIV8 
programmed.
The default clock source setting is the Internal RC Oscillator with 
longest start-up time and an initial system clock prescaling of 8, 
resulting in 1.0 MHz system clock. This default setting ensures that all 
users can make their desired clock source setting using an In-System or 
Parallel programmer.

Dein 2313 läuft wahrscheinlich mit 1Mhz -
programmiere die Fuse CKDIV8 um

von Claude B. (claude44)


Lesenswert?

Der fuse system ist auf 8MHZ 14ck 0ms

das ist die einstellung der Studio, gibt es ein andere methode für das 
setzen der Fuse bit mit derm STK500?

von Claude B. (claude44)


Lesenswert?

Bonjour nochmal.

Der Fuse bite ist richtig eingestellt, j'ai geändert die 125 in 62 une 
bekomme ich annähern 0.5 secunde. das ist mir sehr wichtig, ich möcht 
nämlich ein schaltuhr weiter bauen
Vielendanke, Ich habe viele gelernt

von Pastor Braune (Gast)


Lesenswert?

Lese Dir das mal durch ' Die genaue Sekunde'
Beitrag "Die genaue Sekunde / RTC"

viel Spaß weiterhin

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.