Und zwar will ich damit ein 8BIT
Register seriell ausgeben(SPI Versuch)die Timings werden noch nicht
stimmen.Mit Rotieren über Carry gebe ich das Register Bit für Bit
aus.Bei der Einzelschritt Simulation ist mir aufgefallen das nach dem 8
Bit das Carry 0 wird und nach einem weiteren Durchgang alles von vorne
anfängt. Wie bekomme ich es hin das ch nach genau 8 Bit´s (Durchläufen)
aus der Schleife raus springe. Ich hatte die Idee ein Weiteres Register
mit einer 8 zu laden und dies mit meiner Variable zaehler zu vergleichrn
und sobald es gleich ist zu springen. Mit welchem Befehl kann ich das
machen oder gibt es eine andere Möglichkeit
MFG
blutengel
blutengel schrieb:> aus der Schleife raus springe. Ich hatte die Idee ein Weiteres Register> mit einer 8 zu laden und dies mit meiner Variable zaehler zu vergleichrn> und sobald es gleich ist zu springen.
Ziemlich genau so wird es im AVR-Tutorial gemacht. NUr wird dort ein
Register mit 8 geladen, nach jedem Schleifendurchlauf das Register um 1
runtergezählt und wenn dann das Ergebnis 0 ist, dann sind 8 Durchläufe
vorbei.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Ansteuerung_per_Software
Für meinen Geschmack wird da zuviel hin und her gesprungen
Bei jedem BREQ oder BRNE oder anderem Sprung der auf dem Zustand von
Flags basiert, solltest du dich unbedingt immer Fragen: Wenn eine
Funktion betreten wird, wer garantiert man dann den Zustand der Flags
Wenn aus deinem (späteren) Programm heraus spi_send angesprungen wird,
dann ist die Abarbeitung
Aufruf von spi_send
spi_send:
rjmp start
ok weiter bei start
start:
BReq end
Ooops. Du selbst hast das Zero-Flag nie gelöscht. Wenn es der Aufrufer
nicht tut und zufällig zuletzt ein 0-Ergebnis ausgerechnet hat, dann
gehts hier sofort wieder aus der Funktion raus.
Je weniger Dinge beim Aufruf einer Funktion zu beachten sind, umso
besser. Du willst einem Aufrufer nicht die Umsicht aufbürden, das
Zero-Flag löschen zu müssen ehe er die Funktion aufruft. Das ist ein
vermeidbarer Fehler.
zaehler wird ebenfalls innerhalb der Funktion nicht zuverlässig auf 8
gesetzt. Deine Funktion funktioniert nur für 1 Aufruf und dann nie
wieder.
(Und benutze das bitte nicht als Ausrede, dass noch nicht mehr gefordert
ist. Einen Wert ausgeben kann ich auch mittels
cbi porta,0
sbi Porta, 2
cbi porta,2
cbi porta,0
sbi Porta, 2
cbi porta,2
cbi porta,0
sbi Porta, 2
cbi porta,2
cbi porta,0
sbi Porta, 2
cbi porta,2
cbi porta,0
sbi Porta, 2
cbi porta,2
cbi porta,0
sbi Porta, 2
cbi porta,2
cbi porta,0
sbi Porta, 2
cbi porta,2
cbi porta,0
sbi Porta, 2
cbi porta,2
das würde auch das gewünschte leisten und durch Austausch von ein paar
cbi durch sbi kann ich das anpassen. Also dieses Argument gilt nicht.
Programmieren fängt dort an, wo eine Funktion zuverlässig und ohne
Vorbedingungen das Richtige tut. Und zwar wieder und immer wieder.
Mir ist erstmal wichtig das es vom Prinzip her richtig ist. Das ich
Zähler Flags und sonstiges vor dem aufruf säuber bzw. rücksetzen muss
ist mir klar.Meine Frage ist jetzt ob ich nach dem Prinzip Daten über
SPI senden kann?
MFG
blutengel