Forum: Mikrocontroller und Digitale Elektronik Tiny2313 - Problem


von Blinker (Gast)


Lesenswert?

Hallo,
folgenden Code habe ich für den Attiny2313 geschrieben.

a ist die Laufvariable, die bei jedem Timerinterrupt inkrementiert wird.

Solange sie kleiner als b ist, sollen die LEDs an PORTB leuchten.

Immer, wenn sich a überschlägt, wird b hochgezählt.

Wenn b am Ende (0xFF) ist, soll es wieder bis 0 runterzählen.

Das Ganze soll die LEDs an Port B pulsieren lassen.


Leider regt sich da an Port B aber gar nichts....Hat wer eine Idee?

(Ich möchte nur perifer wissen, was man besser machen könnte; mich 
interessiert wirklich, wo der Fehler hier stecken mag)

Danke!




#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <stdint.h>

uint8_t a, b,c;

int main () {

  DDRB =0xFF;
  PORTB= 0x00;

  TCCR0A = 0x00;
  TCCR0B = 0x03;
  TIMSK = 0x2;

  b = 0;  a = 0;  c = 0;

  while (1) {
    sleep_enable();
    sei();
    sleep_cpu();
    sleep_disable();
  }
}


ISR(TIMER0_OVF_vect) {
  a++;

  if (a < b) {
    PORTB = 0xFF;
  } else {
    PORTB = 0x00;
  }

  if (a == 0xFF) {
    if (c == 0) {
      b++;
    } else {
      b--;
    }

    if (b==0) {
      c = 0;
    }

    if (b==0xFF) {
      c = 1;
    }
  }
  reti();
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Den Sleep-Code habe ich mal weggelassen. Ich sehe noch nicht, wie du aus 
dem Tiefschlaf überhaupt hochkommen willst.

Die ISR Logik habe ich nach deinen Kommentaren umgeschrieben, um es zu 
verstehen.

Bei 1 Mhz Taktquelle werden die LED zum ersten Mal nach 4,2s 
angeschaltet. Dann bleiben sie 16,4 ms an und gehen wieder aus. Nach 
4,2s gehen sie wieder an... die folgenden Zeiten habe ich nicht 
überprüft.

Praktisch habe ich den Blinkcode für zwei active-high LEDs an PD5 und 
PD6, so wie auf dem Pollin Funk AVR Evaluationsboard, umgeschrieben. Bei 
8 MHz blinken die LEDs recht munter und mit unterschiedlichen, 
variierenden Leuchtzeiten.
1
/*
2
  MCU: Attiny2313
3
  F_CPU: ?
4
*/
5
6
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <avr/sleep.h>
9
#include <stdint.h>
10
11
uint8_t a;
12
uint8_t b;
13
14
int main (void) 
15
{
16
#if 1
17
  DDRD |= (1<<PD5) | (1<<PD6);
18
  PORTD &= ~(1<<PD5);
19
  PORTD |= (1<<PD6);
20
#else
21
  DDRB = 0xFF;
22
  PORTB = 0x00;   // LEDs AUS
23
#endif
24
25
  TCCR0A = 0x00;
26
  TCCR0B = 0x03;
27
  TIMSK = 0x2;
28
  sei();
29
30
  while (1) 
31
  {
32
#if 0
33
    /*
34
       Soweit sind wir noch nicht. 
35
       Zuerst muss der Timer anständig laufen
36
       dann kann man sich Gedanken ums Schlafen
37
       und Aufwecken (!) machen.
38
    */
39
    sleep_enable();
40
    sei();
41
    sleep_cpu();
42
    sleep_disable();
43
#endif
44
  }
45
}
46
47
ISR(TIMER0_OVF_vect) 
48
{
49
  static int8_t c; 
50
51
  // a ist die Laufvariable, die bei jedem 
52
  // Timerinterrupt inkrementiert wird.
53
  a++;
54
55
  // Solange a kleiner als b ist, 
56
  // sollen die LEDs an PORTB leuchten.
57
  if (a < b)
58
  { 
59
#if 1
60
    PORTD |= (1<<PD5);
61
    PORTD &= ~(1<<PD6);
62
#else
63
    PORTB = 0xFF;     // alle LEDs AN
64
#endif
65
  }
66
  else 
67
  {
68
#if 1
69
    PORTD &= ~(1<<PD5);
70
    PORTD |= (1<<PD6);
71
#else
72
    PORTB = 0x00;     // alle LEDs AUS
73
#endif
74
  }
75
76
  // Immer, wenn sich a überschlägt, 
77
  // wird b hoch- bzw. runtergezählt.
78
  if (a == 0xFF) 
79
  {
80
    // Wenn b am Ende (0xFF) ist, 
81
    // soll es wieder bis 0 runterzählen.
82
    if (b == 0x00) 
83
      c = 1;
84
    else if (b == 0xFF) 
85
      c = -1;
86
    b += c;
87
  }
88
}

von Justus S. (jussa)


Lesenswert?

Blinker wrote:
>
> Leider regt sich da an Port B aber gar nichts....Hat wer eine Idee?
>


a, b, c musst du schon volatile machen...

von Johannes M. (johnny-m)


Lesenswert?

Justus Skorps wrote:
> a, b, c musst du schon volatile machen...
Nö, da gibt es (zumindest in Blinkers originalem Programm) keinen Anlass 
für. Die Variablen werden da nur in der ISR verwendet (mal abgesehen von 
der überflüssigen Initialisierung auf Null in main).

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.