Forum: Mikrocontroller und Digitale Elektronik mega 8 code läuft nicht auf tiny13


von Uli (Gast)


Lesenswert?

Hier erstmal der Code:
#include <avr/io.h>
#include <stdint.h>       //für die Zahlen
#include <avr/wdt.h>// watchdog

volatile unsigned char zeitget(void);
unsigned char stand;

int main (void)
{
TCCR0B|=0b00000011;//Timer0 auf prescaler 64 --> Periode ca. 3,4ms bei
4,8Mhz
DDRB=(0 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|(0 << PB4);//|(0 <<
PB5);//Port b0 eingang, b1 - b2-b5 Ausgang
PORTB=(0 << PB0)|(0 << PB1)|(0 << PB2)|(0 << PB3)|(0 << PB4);//|(0 <<
PB5);//keine Pullups bzw. high
stand=0;
TCNT0=0;//counter0 mit 0 initialisieren
wdt_enable(7);//Reset nach 1,9s kein signal
  while (1)
  {

  zeitget();
  switch(stand)
    {
    case 0 : PORTB = (0 << PB1)|(0 << PB2)|(0 << PB3)|(0 << PB4); break;
    case 1 : PORTB = (0 << PB1)|(0 << PB2)|(0 << PB3)|(0 << PB4); break;
    case 2 : PORTB = (1 << PB1)|(1 << PB2)|(0 << PB3)|(0 << PB4); break;
    case 3 : PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4); break;
    }


  }//end while

}//end main

//Funktionen
unsigned char zeitget(void)//Misst die Zeit, die das signal high ist.
{

if  (PINB & (1<<PB4)) //wenn high
  {
  wdt_reset();//wenn ppm signal da,  wird der watchdog geresettet
  TCNT0=0;
  while ((PINB & (1<<PB0)))
  {//warten solange low
  if (TCNT0==0) stand =0;
  if (TCNT0<80) stand =1;
  if ((TCNT0 > 80)&&(TCNT0<110)) stand =2;//ungefähr 1,4ms - 1,6ms
  if ((TCNT0 > 110)) stand =3;
    }
  }

return stand;
}

Zur Funktion: Entsprechend der Dauer eines Pulsbreitenmodulierten 
signales sollen portpins eingeschaltet werden.
Ich hab den Mega 8 und tiny13 auf dem Gleichen Steckbrett programmiert, 
also kein Hardwareproblem. Das TCCR0-Register hab ich auch schon auf 
Tccr0b umbenannt. Der einzige wirkliche unterschied zum mega 8 code 
liegt darin, dass ich jetzt pb0 als eingang nehme und pb1-4 als ausgang. 
beim mega 8 hatte ich pb0 als eingang und portd als ausgänge. Beim mega8 
funzt die Sache und bei dem tiny13 nicht mehr. Ich steh echt auf dem 
Schlauch, wäre daher für Hilfe echt dankbar.

von Uli (Gast)


Lesenswert?

Wie siehts aus Experten? Kann keiner einem Anfänger etwas auf die 
Sprünge helfen?
Gruß, Uli

von Hc Z. (mizch)


Lesenswert?

Was auf gleich auffällt:

> case 3 : PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4); break;

Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/” 
statt „|” am Ende).

von Lutz (Gast)


Lesenswert?

>Der einzige wirkliche unterschied zum mega 8 code liegt darin,
>dass ich jetzt pb0 als eingang nehme und pb1-4 als ausgang.

>DDRB=(0 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|(0 << PB4);
sagt aber was anderes.                            ^^^

> unsigned char zeitget(void)//Misst die Zeit, die das signal high ist.
> {
>
> if  (PINB & (1<<PB4)) //wenn high
>   {
>   wdt_reset();//wenn ppm signal da,  wird der watchdog geresettet
>   TCNT0=0;
>   while ((PINB & (1<<PB0)))
>   {//warten solange low
>   if (TCNT0==0) stand =0;
>   if (TCNT0<80) stand =1;
>   if ((TCNT0 > 80)&&(TCNT0<110)) stand =2;//ungefähr 1,4ms - 1,6ms
>   if ((TCNT0 > 110)) stand =3;
>     }
>   }
>
> return stand;
> }

Den Ablauf verstehe ich nicht. Der Watchdog wird nur resettet, wenn 
PINB4 high ist. Was ist, wenn er es in der Watchdogzeit nicht schafft? 
=> Reset vermutlich, aber der Code fehlt ja.
Dann setzt Du TCNT0 auf Null. Wo wird denn eigentlich der Counter 
gestartet?
Dann kommt eine Schleife mit der Bedingung, daß PINB0 high ist. Es folgt 
aber ein Kommentar //warten solange low.
Dann kommt ein Test, ob TCNT0 Null ist. Muß er ja, hast ihn ja vorher 
auf Null gesetzt.
Dann kommt ein Test, ob TCNT0 kleiner als 80 ist. Logisch ist er das; 
hast ihn ja auf Null gesetzt. Nun änderst Du die Variable Stand etc, 
case 0 und case 1 sind gleich etc....

Ich glaube nicht, daß das vorher auf einem Tiny so gelaufen sein soll.

von Uli (Gast)


Lesenswert?

Danke für die Infos. Ich muss dann erstmal Fehler korrigieren.
U

von Uli (Gast)


Lesenswert?

Hc Zimmerer schrieb:
> Was auf gleich auffällt:
>
>> case 3 : PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4); break;
>
> Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/”
> statt „|” am Ende).

Der Fehler ist klar, aber wieso kommt - sofern richtig geschrieben - nur 
null raus. Wie sollte es denn richtig sein? Danke.

von Grrr (Gast)


Lesenswert?

(1 << PB4) > (1 << PB1)|(1 << PB2)|(1 << PB3)

von Grrr (Gast)


Lesenswert?

Uli schrieb:
>> Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/”
>> statt „|” am Ende).
>
> Der Fehler ist klar, aber wieso kommt - sofern richtig geschrieben - nur
> null raus. Wie sollte es denn richtig sein? Danke.

Was an:
>> Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/”
>> statt „|” am Ende).
hast Du nicht verstanden?

von Uli (Gast)


Lesenswert?

Dass da kein / sondern | reinsoll ist ja klar. Aber warum wird der 
Ausdruck zu null? Ich dachte der ist mit dem Fehler ganz ungültig, aber 
null? Übrigens hilft man einem Anfänger wenig, ihm schlaue Gegenfragen 
zu stellen. Erklären, wo es hängt hilft da besser. ;)
Gruß, Uli

von Grrr (Gast)


Lesenswert?

Uli schrieb:
> Aber warum wird der
> Ausdruck zu null?

Was an
Grrr schrieb:
> (1 << PB4) > (1 << PB1)|(1 << PB2)|(1 << PB3)

hast Du nicht verstanden?

Uli schrieb:
> Übrigens hilft man einem Anfänger wenig, ihm schlaue Gegenfragen
> zu stellen. Erklären, wo es hängt hilft da besser.

Eben. Die Erklärung wurde Dir gegeben. Wenn Du sie nicht verstehst, 
obwohl sie trivial ist, dann muss man nachfragen, was Du an der 
Erklärung nicht verstanden hast.
Im übrigen wirst Du, wenn Du andere um Hilfe fragst mit der Art von 
Hilfe vorlieb nehmen müssen, die man Dir gibt.
Ich, zum Beispiel, gebe Hilfe zur Selbsthilfe, aber ich kaue nicht jedes 
Detail vor.

von Uli (Gast)


Lesenswert?

Ich glaub ich habs. Die Threshholds für logisch 1/0 beim mega 8 liegen 
in einer anderen Kante als beim Tiny 13. Versuche es heute Abend mal 
umzubasteln und berichte.

gruß, Uli

von Thomas (Gast)


Lesenswert?

Uli schrieb:
> PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4)

entspricht in dezimaler Schreibweise:
PORTB = (2 + 4 + 8) / 16 = 0.875

Und 0.875 auf Integer gecastet wird zu 0. Also enthält PORTB den Wert 0.

von Uli (Gast)


Lesenswert?

Wenn es dir zu blöd ist auf meine dumme Frage auf eine konstruktive 
Weise zu antworten, machs wie die anderen, antworte garnicht.
Falls du glaubst, ich will mir alles vorkauen lassen, dem ist nicht so. 
Und selbst wenn, das ist ein Forum das genau dafür da ist. Meine Güte, 
selbst das Internet ist voll von Leuten, die von ihren Eltern nie umarmt 
worden sind.
Uli

von Uli (Gast)


Lesenswert?

Danke Thomas!

von Peter D. (peda)


Lesenswert?

Thomas schrieb:
> Uli schrieb:
>> PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4)
>
> entspricht in dezimaler Schreibweise:
> PORTB = (2 + 4 + 8) / 16 = 0.875

Nö.

PORTB = 2 + 4 + 8 / 16 = 6.5
1
  PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4);
2
  48:   86 e0           ldi     r24, 0x06       ; 6
3
  4a:   88 bb           out     0x18, r24       ; 24


Peter

von Grrr (Gast)


Lesenswert?

Uli schrieb:
> Wenn es dir zu blöd ist auf meine dumme Frage auf eine konstruktive
> Weise zu antworten, machs wie die anderen, antworte garnicht.
Es ist mir nicht zu blöd, sonst hätte ich garnicht geantwortet.
Du machst einen Fehler wenn Du meine Art zu antworten persönlich nimmst. 
Sie sollte keine Kritik an Deiner Art zu fragen sein.

> Und selbst wenn, das ist ein Forum das genau dafür da ist.

Das Forum ist das was wir daraus machen. Nicht was Du denkst.

Das Dir meine Antwort nicht gefällt ist ja ok. Aber mir deswegen ein 
Fehlverhalten vorzuwerfen ist schlicht absurd.

von Grrr (Gast)


Lesenswert?

Na toll. Voll in die Sch... getreten.

von Hannes L. (hannes)


Lesenswert?

Grrr schrieb:
> Na toll. Voll in die Sch... getreten.

Mach' Dir nix d'raus, das passiert mir auch immer wieder mal. Hilfe zur 
Selbsthilfe kommt bei einigen Leuten nicht an.

...

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.