Einfachstes Programm geht nicht ATTINY13

Gast #2668171
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
#2668182
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.
Gast #2668229
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren