www.mikrocontroller.net

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


Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Infos. Ich muss dann erstmal Fehler korrigieren.
U

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(1 << PB4) > (1 << PB1)|(1 << PB2)|(1 << PB3)

Autor: Grrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Grrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Thomas!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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
  PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4);
  48:   86 e0           ldi     r24, 0x06       ; 6
  4a:   88 bb           out     0x18, r24       ; 24


Peter

Autor: Grrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na toll. Voll in die Sch... getreten.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

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.