www.mikrocontroller.net

Forum: Compiler & IDEs ATTiny13 Probleme mit 3xEin 1x Aus und PWM


Autor: Bernd M. (adventureman1972)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Habe schon seit ca. zwei Wochen ein Problem mit dem Programm, das nicht 
macht was es soll. Verschiedene Lösungswege die mir Plausibel 
erschienen, lieferten mir nicht das, was ich möchte. Die meiste Zeit 
wird die erste while-Schleife übersprungen und sofort mit der zweiten 
weitergemacht.

Das ganze soll die Blink-/ Warnblink-Funktion eines RC-Modellautos 
werden.
Gedacht ist das so:

Akku voll --> Blinker werden weitergereicht.
Akku leer --> Warnblinker wird eingeschaltet. (Vom ersten ATTiny13 wurde 
der Lastkreis ausgeschaltet. )

Neustart durch Akkuwechsel!


Ich habe einen Ausgang vom ersten ATTiny13 auf einen Eingang eines 
zweiten ATTiny13 verdrahtet. Der erste µC überwacht per ADC einen Akku 
und schaltet den Ausgang bei Unterschreiten von einer Schaltschwelle 
dauerhaft aus.

Der zweite µC soll bei dem weitergereichten 1-Signal die Eingänge PB3 
und PB4 ( verODERt ) auf 0-Signal abfragen und einen vorgegebenen Takt 
auf PB0 ausgeben. Die Eingänge werden jeweils mit Pullup-Rs auf Vcc 
gelegt und mit Transistoren gegen GND geschaltet.

Wenn der Ausgang vom µC(1) das Signal 0 liefert soll PB1 eingeschaltet 
werden und der Takt dauerhaft ausgegeben werden. Mit dem Ausgang wird 
gleichzeitig der MOSFET IRF1310N angesteuert.


Wo liegt mein Denkfehler?
/*
    Anschlüsse des zweiten ATTiny 13:

                       ---
          Reset  RES -|*  |- VCC
      Eingang L  PB3 -|   |- PB2   Eingang Akku Ok von ersten ATTiny13
      Eingang R  PB4 -|   |- PB1   Warnblinker bei Akku leer
                 GND -|   |- PB0   Takt weiter auf LEDs
                       ---

*/

#define F_CPU 9600000
#include <avr/io.h>
#include <util/delay.h>

#define MIN 16

/****************************************************************************************/
  
void Takt()
{
  TCCR0A |= (1<<COM0A1);
  for (char a=MIN; a<255; a++)   { _delay_us(160); OCR0A = a; }  // Rampe hoch
  _delay_ms(872.5);                        // Wert beibehalten Spannungen
  for (char b=255; b>MIN; b--)   { _delay_us(340); OCR0A = b; }  // Rampe runter
  TCCR0A &= ~(1<<COM0A1);
  _delay_ms(913.3);
}

/****************************************************************************************/
  
int main (void)
{
  DDRB |= 0x03;   // Ausgänge

  // Grundeinstellungen für PWM 
  TCCR0A  |= (1<<COM0A1);      // Compare Match Output A Mode; Non PWM Mode; Fast PWM Mode; Phase Correct PWM Mode
//  TCCR0A  |= (1<<COM0A0);      // Compare Match Output A Mode; 00 -> Normal Mode OC0x abgeschaltet
//  TCCR0B  |= (1<<COM0B1);      // Compare Match Output B Mode; 01 -> Res. 
//  TCCR0B  |= (1<<COM0B0);      // Compare Match Output B Mode; 10 -> Löschen OC0x bei Compare Match, set on Top
//  Reserve                              11 -> Set Oc0x bei Compare Match, löschen on Top
//  Reserve
  TCCR0A  |= (1<<WGM01 );      // Waveform Generation Mode
  TCCR0A  |= (1<<WGM00 );      // Table 11-8 on Page 72 (ATTiny13(doc2535).pdf)  
  
//  TCCR0B  |= (1<<FOC0A );      // Nicht bei Fast PWM
//  TCCR0B  |= (1<<FOC0B );      // Nicht bei Fast PWM
//  RESERVE
//  RESERVE
//  TCCR0B  |= (1<<WGM02 );      // Binäre Zählung bei WGM02 -> WGM00
//  TCCR0B  |= (1<<CS02  );      // Prescaler     0  , 1, 2,  3,   4,    5,   6,   7
//  TCCR0B  |= (1<<CS01  );      // Prescaler  No CLK, 1, 8, 64, 256, 1024, ext, ext
  TCCR0B  |= (1<<CS00  );      // Prescaler  Binäre Zählung bei CS02 -> CS00

/****************************************************************************************/
  
  OCR0A = MIN;
  _delay_ms(6000);   // Warten auf Signal von ATTiny 13/1

  while ((PORTB & 0x04) == 0x04)
  {
    if ((PORTB & 0x18) == 0x18) {;} else { Takt(); }
  }

  PORTB |= (1<<PB1);

  while ((PORTB & 0x04) != 0x04)
  {
    Takt();
  }

return(0);
}







Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informiere dich mal über das Register PINB und den Unterschied zu PORTB.

Aber auch wenn du deinen Code dahingehend korrigiert hast, macht er 
irgendwie nicht so richtig Sinn. Überdenke das nochmal komplett neu.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, ich habe erst auf den zweiten Blick kapiert, was das darstellen 
soll. Das "nicht so richtig Sinn" ist etwas übertrieben,sorry.
Dennoch: entweder sollte das zweite while eine Endlosschleife sein, oder 
es fehlt eine umschließende Endlosschleife, je nach dem, wie er aus dem 
Warnblink-Modus wieder rauskommen soll. Nur durch einen Hard-Reset 
(Akkuwechsel), oder auch durch ein neues Akku-Voll-Signal.

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.