mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny2313 - Problem


Autor: Blinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
/*
  MCU: Attiny2313
  F_CPU: ?
*/

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

uint8_t a;
uint8_t b;

int main (void) 
{
#if 1
  DDRD |= (1<<PD5) | (1<<PD6);
  PORTD &= ~(1<<PD5);
  PORTD |= (1<<PD6);
#else
  DDRB = 0xFF;
  PORTB = 0x00;   // LEDs AUS
#endif

  TCCR0A = 0x00;
  TCCR0B = 0x03;
  TIMSK = 0x2;
  sei();

  while (1) 
  {
#if 0
    /*
       Soweit sind wir noch nicht. 
       Zuerst muss der Timer anständig laufen
       dann kann man sich Gedanken ums Schlafen
       und Aufwecken (!) machen.
    */
    sleep_enable();
    sei();
    sleep_cpu();
    sleep_disable();
#endif
  }
}

ISR(TIMER0_OVF_vect) 
{
  static int8_t c; 

  // a ist die Laufvariable, die bei jedem 
  // Timerinterrupt inkrementiert wird.
  a++;

  // Solange a kleiner als b ist, 
  // sollen die LEDs an PORTB leuchten.
  if (a < b)
  { 
#if 1
    PORTD |= (1<<PD5);
    PORTD &= ~(1<<PD6);
#else
    PORTB = 0xFF;     // alle LEDs AN
#endif
  }
  else 
  {
#if 1
    PORTD &= ~(1<<PD5);
    PORTD |= (1<<PD6);
#else
    PORTB = 0x00;     // alle LEDs AUS
#endif
  }

  // Immer, wenn sich a überschlägt, 
  // wird b hoch- bzw. runtergezählt.
  if (a == 0xFF) 
  {
    // Wenn b am Ende (0xFF) ist, 
    // soll es wieder bis 0 runterzählen.
    if (b == 0x00) 
      c = 1;
    else if (b == 0xFF) 
      c = -1;
    b += c;
  }
}

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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).

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.