Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 Standartoperation(total easy wahrscheinlich)


von Marco Balter (Gast)


Lesenswert?

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);
  }

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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).

von Marco Balter (Gast)


Lesenswert?

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??

von Marco Balter (Gast)


Lesenswert?

Ach ja, meinen überlegungen zufolge müsste es doch eine konstante 
abweichung geben....

von uwegw (Gast)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

Sind die 8MHz sicher, oder ist da noch der Vorteiler /8 drin?

von uwegw (Gast)


Lesenswert?

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.

von Marco Balter (Gast)


Lesenswert?

Welcher Vorteiler?? Ich habe bei den Fusebits nur das clksel auf 0100 
gestellt....

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

> 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.

von Marcus (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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 ;-)

von Marco Balter (Gast)


Lesenswert?

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....

von Marco Balter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.