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


von Bernd M. (adventureman1972)


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?
1
/*
2
    Anschlüsse des zweiten ATTiny 13:
3
4
                       ---
5
          Reset  RES -|*  |- VCC
6
      Eingang L  PB3 -|   |- PB2   Eingang Akku Ok von ersten ATTiny13
7
      Eingang R  PB4 -|   |- PB1   Warnblinker bei Akku leer
8
                 GND -|   |- PB0   Takt weiter auf LEDs
9
                       ---
10
11
*/
12
13
#define F_CPU 9600000
14
#include <avr/io.h>
15
#include <util/delay.h>
16
17
#define MIN 16
18
19
/****************************************************************************************/
20
  
21
void Takt()
22
{
23
  TCCR0A |= (1<<COM0A1);
24
  for (char a=MIN; a<255; a++)   { _delay_us(160); OCR0A = a; }  // Rampe hoch
25
  _delay_ms(872.5);                        // Wert beibehalten Spannungen
26
  for (char b=255; b>MIN; b--)   { _delay_us(340); OCR0A = b; }  // Rampe runter
27
  TCCR0A &= ~(1<<COM0A1);
28
  _delay_ms(913.3);
29
}
30
31
/****************************************************************************************/
32
  
33
int main (void)
34
{
35
  DDRB |= 0x03;   // Ausgänge
36
37
  // Grundeinstellungen für PWM 
38
  TCCR0A  |= (1<<COM0A1);      // Compare Match Output A Mode; Non PWM Mode; Fast PWM Mode; Phase Correct PWM Mode
39
//  TCCR0A  |= (1<<COM0A0);      // Compare Match Output A Mode; 00 -> Normal Mode OC0x abgeschaltet
40
//  TCCR0B  |= (1<<COM0B1);      // Compare Match Output B Mode; 01 -> Res. 
41
//  TCCR0B  |= (1<<COM0B0);      // Compare Match Output B Mode; 10 -> Löschen OC0x bei Compare Match, set on Top
42
//  Reserve                              11 -> Set Oc0x bei Compare Match, löschen on Top
43
//  Reserve
44
  TCCR0A  |= (1<<WGM01 );      // Waveform Generation Mode
45
  TCCR0A  |= (1<<WGM00 );      // Table 11-8 on Page 72 (ATTiny13(doc2535).pdf)  
46
  
47
//  TCCR0B  |= (1<<FOC0A );      // Nicht bei Fast PWM
48
//  TCCR0B  |= (1<<FOC0B );      // Nicht bei Fast PWM
49
//  RESERVE
50
//  RESERVE
51
//  TCCR0B  |= (1<<WGM02 );      // Binäre Zählung bei WGM02 -> WGM00
52
//  TCCR0B  |= (1<<CS02  );      // Prescaler     0  , 1, 2,  3,   4,    5,   6,   7
53
//  TCCR0B  |= (1<<CS01  );      // Prescaler  No CLK, 1, 8, 64, 256, 1024, ext, ext
54
  TCCR0B  |= (1<<CS00  );      // Prescaler  Binäre Zählung bei CS02 -> CS00
55
56
/****************************************************************************************/
57
  
58
  OCR0A = MIN;
59
  _delay_ms(6000);   // Warten auf Signal von ATTiny 13/1
60
61
  while ((PORTB & 0x04) == 0x04)
62
  {
63
    if ((PORTB & 0x18) == 0x18) {;} else { Takt(); }
64
  }
65
66
  PORTB |= (1<<PB1);
67
68
  while ((PORTB & 0x04) != 0x04)
69
  {
70
    Takt();
71
  }
72
73
return(0);
74
}

von Stefan E. (sternst)


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.

von Stefan E. (sternst)


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.

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.