Forum: Mikrocontroller und Digitale Elektronik Einfachstes Programm geht nicht ATTINY13


von Odonata (Gast)


Lesenswert?

Hi,

ich probier jetzt seit 3 Tagen ein Programm auf einem ATTINY13 laufen zu 
lassen aber es will nicht.

Code:
-----------------------------------------------------------------
#include <avr/io.h>
#include <stdint.h>

void init_PWM_t13 () {
  //FastPWM, TOP=0xFF, non-invert OC0x
  // COM00 COM01 => Normal port operation, OC0A disconnected.
  // COM0A1 =>   Clear OC0A on Compare Match when up-counting. Set OC0A 
on
  //        Compare Match when down-counting.

  TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00); // Compare Match 
Output A Mode | Waveform Generation Mode
  TCNT0  = 0; //Timer/Counter Register all to zero
  TCCR0B = (1<<CS00); // clkI/O (No prescaling)
}

int main (void){

  DDRB  |= (1<<PB0); //| (1<<PB1); //PWM sind Ausgänge
    DDRB &= ~( 1 << PB1 );        /* PIN PB1 auf Eingang Taster)  */
    DDRB &= ~( 1 << PB2 );        /* PIN PB2 auf Eingang Taster)  */
    PORTB |= ( 1 << PB1 ) | ( 1 << PB2 );        /* Pullup-Widerstand 
aktivieren */

  init_PWM_t13();

  uint8_t i=30;
  while(1){
    if( PINB & ( 1 << PB1 ) ) {
      if( 253 == i ) {
        i = i + 1;
      }
    } else if( PINB & ( 1 << PB2 ) ) {
      if( 1 == i ) {
        i = i - 1;
      }
    }
    OCR0A=i;
  }
}
---------------------------------------------------------------------
Was ich will:
Nach meinem Programm will ich PIN PB1 bzw. PB2 "Auslesen" und dann 
dementsprechend meine Zählvariable i hoch/runter zählen dementsprechend 
wir dann eine LED an PB0 heller oder dunkler.

Problem:
es tut sich nichts wenn ich einen Taster Drücke...
meine Eingänge sind auf 5V und werden von den Tastern auf GND gezogen 
was ich auch messen kann aber in meinem µC tut sich nichts.

Auffälligkeit:
nach dem Einschalten sollte ja eingentlich mein PWM auf "30" stehen aber 
ich hab volle Leistung.


PS:
- PWM Geht, ohne Abfragen ist alles setzbar.
- zuvor hab ich die Helligkeit mit einem Poti und dem ADC realisiert was 
auch funktioniert hat.


TIPS, Ratschläge

von Karl H. (kbuchegg)


Lesenswert?

Odonata schrieb:

> Nach meinem Programm will ich PIN PB1 bzw. PB2 "Auslesen" und dann
> dementsprechend meine Zählvariable i hoch/runter zählen dementsprechend
> wir dann eine LED an PB0 heller oder dunkler.
>
> Problem:
> es tut sich nichts wenn ich einen Taster Drücke...

Was denkst du, wie lange dauert es wohl, bis dein µC einmal diesen Code 
in der Schleife abgearbeitet hat. Oder anders rum: wie oft schafft er es 
wohl, diesen Code in einer Sekunde abzuarbeiten:
1
  while(1){
2
    if( PINB & ( 1 << PB1 ) ) {
3
      if( 253 == i ) {
4
        i = i + 1;
5
      }
6
    } else if( PINB & ( 1 << PB2 ) ) {
7
      if( 1 == i ) {
8
        i = i - 1;
9
      }
10
    }
11
    OCR0A=i;
12
  }


Ich würde mal schätzen, dass du mit 8 bis 10 tausend mal sicher nicht 
schlecht liegst.

Denkst du wirklich du kannst deine Taste so zielgenau drücken und wieder 
loslassen, dass du da reproduzierbar dein i auf einen Wert einstellen 
kannst?

Das ist das eine.
Das andere ist: Wie soll denn i jemals etwas anderes als 30 sein, wenn 
du nur dann ein Erhöhen erlaubst, wenn i bereits 253 IST? (bzw 1 im 
anderen Fall)


Tip von mir.
Lass den Quatsch

      if( 253 == i ) {

schreibs so, wie du denkst bzw. wie du es sagen würdest.
Wenn i gleich 253 ist

      if( i == 253 ) {

Du machst weniger Fehler damit, als wenn du dein Gehirn vergewaltigen 
musst.
Ja, ich kenne die Argumente, dass diese Schreibweise ein versehentliches 
= anstatt eines == abfängt. Und nein, ich halte dieses Argument nicht 
für stichhaltig. Den Fehler machst du vielleicht 2 oder 3 mal und dann 
nie wieder.
Im Falle eines Falles musst du sowieso die Bedingung analysieren, dann 
kommst du auf diesen Fehler drauf. Oder eben wie hier, dass die ganze 
Abfrage auf Gleichheit falsch ist.

von Ingo (Gast)


Lesenswert?

Wenn deine Taster auf GND schalten musst du das auch abfragen, im Moment 
fragst du einen nicht betätigten Taster ab...

Ingo

von Ingo (Gast)


Lesenswert?

Karl Heinz hat natürlich auch recht. Pack mal n Delay rein und 
überarbeite deinen if Teil

von Karl H. (kbuchegg)


Lesenswert?

Ingo hat natürlich auch recht. Hab ich wiederrum noch gar nicht gesehen.

von Odonata (Gast)


Lesenswert?

Erst mal danke.
habe nun vollgendes:
code:
----------------------------------------------------------
#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 8000000UL

void init_PWM_t13 () {
  //FastPWM, TOP=0xFF, non-invert OC0x
  // COM00 COM01 => Normal port operation, OC0A disconnected.
  // COM0A1 =>   Clear OC0A on Compare Match when up-counting. Set OC0A 
on
  //        Compare Match when down-counting.

  TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00); // Compare Match 
Output A Mode | Waveform Generation Mode
  TCNT0  = 0; //Timer/Counter Register all to zero
  TCCR0B = (1<<CS00); // clkI/O (No prescaling)
}

int main (void){

  DDRB  |= (1<<PB0); //| (1<<PB1); //PWM sind Ausgänge
    DDRB &= ~( 1 << PB1 );        /* PIN PB1 auf Eingang Taster)  */
    DDRB &= ~( 1 << PB2 );        /* PIN PB2 auf Eingang Taster)  */
    PORTB |= ( 1 << PB1 ) | ( 1 << PB2 );        /* Pullup-Widerstand 
aktivieren */

  init_PWM_t13();

  uint8_t i=250;
  while(1){
    _delay_ms(10);
    if( !(PINB & ( 1 << PB1 ))) {
      if( i<254 ) {
        i = i + 1;
      }
    } else if( !(PINB & ( 1 << PB2 ))) {
      if( i>2 ) {
        i = i - 1;
      }
    }
    OCR0A=i;
  }
}
-------------------------------------

leider klappt das mit dem delay nicht ich bekomme den Fehler:
avrdude: ERROR: address 0x0410 out of range at line 65

es liegt am _delay_ms(10); das weis ich, aber was ist da nun falsch?

Danke

von Dietrich L. (dietrichl)


Lesenswert?

Odonata schrieb:
> #include <util/delay.h>
>
> #define F_CPU 8000000UL

F_CPU muss vor delay.h definiert werden, da es dort gebraucht wird.

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

address 0x0410

der Zahlenwert ist ein wenig hoch.
Hast du den Optimizer eingeschaltet? Das ist wichtig! Der muss auf Os 
stehen. (In den Project Options umstellen)

von Odonata (Gast)


Lesenswert?

Die Reihenfollge ist geändert aber fehler bleibt.

optimierung steht auf 0


ich zieh gerade die Programmiererhölle an :-(

von Karl H. (kbuchegg)


Lesenswert?

Odonata schrieb:
> Die Reihenfollge ist geändert aber fehler bleibt.
>
> optimierung steht auf 0

Os   ( Ooooh ess )

von Odonata (Gast)


Lesenswert?

OK kahm an... und geändert...und geht .

Da spricht halt deutlich mehr Erfahrung wie auf dieser seite.

Danke für alles GRüße
Odonata

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.