Hallo, Ich brauche Hilfe, ich versuche schon seit etlichen Stunden eine Standartfunktion zu realisieren aber der ATMEGA8 macht einfach nicht dass was ich will, also folgendes: Ich will einfach den PD0 mit dem PC2, den PD2 mit dem PC1, und den PD3 mit dem PC0 verbinden. Dh. lege ich am PD0 ein Rechtecksignal an dann soll am PC2 das selbe rechteck herauskommen. Folgender Fehler: Wennn ich das rechteck am Ausgang anschaue dann zittert es herum, also ich bekomme kein stehendes Bild. Hier der Quellcode: while(1) { if( PIND & (1<<PIND3) ) { PORTC |= (1<<PC0); } else { PORTC &= ~ (1<<PC0); } if ( PIND & (1<<PIND2) ) { PORTC |= (1<<PC1); } else { PORTC &= ~ (1<<PC1); } if ( PIND & (1<<PIND0) ) { PORTC |= (1<<PC2); } else { PORTC &= ~ (1<<PC2); }
Was meinst du mit Rumzittern? Hast du deinen Versuch schon mit unterschiedlichen Eingangsfrequenzen an Port D probiert? Ich schätze bei niedrigen Eingangsfrequenzen arbeitet das Programm wie vorgesehen und je höher die Frequenzen werden, desto mehr machte es die Grätsche, weil Berechnungen innerhalb while(1){..} zu lange dauern. BTW. mit welcher Taktfrequenz schuftet der Atmega8 - hier müsstet du einen möglichst hohen Takt einsetzen, wenn du schnelle Eingangssignale hast (Stichwort Abtastrate http://de.wikipedia.org/wiki/Abtastrate).
8 Mhz Takt max. Eingangsfequenz 50 kHz Also ich habe am Funktionsgen. gedreht und du hast schon rech bei kleinerer Taktfrequenz ist es weniger (1khz) als bei den 50khz. Was kann ich tun??
Ach ja, meinen überlegungen zufolge müsste es doch eine konstante abweichung geben....
Der Takt des externen Signals und der Takt des AVRs laufen ja nicht synchron. Daher wird das Signal immer an verschiedenen Punkten abgetastet. Wenn nun eine Abtastung ganz knapp vor der steigenden Flanke stattfindet, wird diese erst mit einer Zykluszeit Verzögerung erkannt. Daher dein Jitter.
Sind die 8MHz sicher, oder ist da noch der Vorteiler /8 drin?
Wie gesagt, die erste Maßnahme wäre ein möglichst hoher Takt. Ändert sich das Signal schnell? Wenn nicht, dann könnte man die Frequenz messen, aus mehreren Messwerten die Mittelwert bilden und damit ein Augangssignal neu erzeugen.
Welcher Vorteiler?? Ich habe bei den Fusebits nur das clksel auf 0100 gestellt....
Hi Marco, darf man fragen, was das ganze fuer einen Sinn hat, also warum Du das Signal nicht einfach direkt auswerten kannst? Vielleicht gibt es ja eine bessere Loesung, daher nicht immer nach Umsetzungen fragen sondern das Problem in seiner Gesamtheit schildern. Machst Du mit dem Controller eine Verarbeitung? Moeglicherweise kannst Du ein Synchronisationssignal benutzen oder das Signal an einen Interrupt-Pin einspeisen. Eine gewisse zeitliche Verzoegerung mit der Ausgabe wirst Du allerdings so immer haben, egal wie Du es machst, also das Ausgangssignal wird zeitlich leicht versetzt zum Eingangssignal sein... Die Verarbeitung in der Hauptschleife scheint mir keine gute Idee, aus oben genannten Gruenden, vor allem aber wenn da noch mehr Code dazukommt. Michael
> Welcher Vorteiler?? Ich habe bei den Fusebits nur das clksel auf 0100 > gestellt.... Sorry. Der Mega8 hat keinen. Ich hatte da die neueren Typen wie Mega88 im Kopf, die einen programmierbaren Vorteiler haben, über den schon mancher überraschte Quarz-Anwender gestolpert ist.
Da es sich ja um Rechtecksignale handelt wäre eine Möglichkeit mit Capture/Compare zu arbeiten. Allerdings sehe ich dabei auch Nachteile, kommt halt auf die Anwendung an. Marcus
Ein bischen was könntest du mit geschickterer Programmierung machen. Wenn du weiterhin in der Hauptschleife arbeiten willst, könntest du EINMAL den Zustand von PIND holen, die DREI fraglichen Bits freimaskieren und anhand des so ermittelten Ergebnisses z.B. über eine Tabelle oder switch Anweisung eine Bitmaske für PORTC holen und den EINMAL setzen. Wenn du später(?) noch mehr in der Hauptschleife machen willst und dadurch die Gefahr besteht, dass die Abtastung noch unregelmäßiger wird, kannst du die Abfrage/Setzen-Schleife auch in einen Timerinterrupt packen. Noch geschickter wäre es, wenn du die Hardware des µC ausnutzt, um z.B. einen Interrupt beim Flankenwechsel auszulösen und dann in der entsprechenden Interruptroutine darauf zu reagieren. Ansonsten ist die Frage von Michael G. auch berechtigt ;-)
Die Gesamtaufgabe ist einfach eine Sehr flexiblen Switch zu bauen, der PortD wird einmal als ausgang, dann wider als eingang verwendet usw. Eine Signalanalyse ist nicht sinnvoll da es immer andere Signale sind.... Es wäre auch kein Problem wenn die Sinale zeitveretzt sind, jedoch sollten alle gleich versetzt sein....
Ich habe nun nur noch eine if else anweisung drinnen aber es zittert immernoch !
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.