Tiny2313 - Problem

Gast #1152746
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
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
}
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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.