Tiny2313 - Problem

Gast #1152746
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();
}
Persönliche Seite #1152867
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren