Hallo, Ich habe einen Atmega32 den ich per Assembler programmiere (bzw. programmieren will ;-) Zur steuerung von ein paar L298 habe ich mir gedacht da sind 2 Schieberegister hintereinander perfekt. Ich habe die schieberegister ungefähr nach dieser Anleitung Zusammengelötet http://www.mikrocontroller.net/wiki/Bild:Hc595-porterweiterung.png Nun weiß ich allerding nicht wie ich sie ansteuern soll. Nach dem ich es nicht direkt hinbekommen habe, habe ich mal diesen Code testweise ausprobiert: ldi temp, 0b00000000 out PORTC, temp inc temp out PORTC, temp inc temp out PORTC, temp . . 12 mal noch hoch 10 mal noch runter . . dec temp out PORTC, temp dec temp out PORTC, temp dec temp Das Ergebnis ist die Erkenntnis das die Schieberegister im Prinzip funktionieren. Ich habe es auch schonaml probiert das ding gezielt anzusprechen aber ich habe kein Erfolg, und da ich nicht sicher war mit den flanken habe ich auch alles Probiert ;-( könnt ihr mir vielleicht ein beipiel Code geben? oder der Ablauf wie die Bits gesetzt werden müssen? Ich denke auf SER liegen immer die zum reintakten gedachten Daten Mit SCK wird getaktet (low ==> high oder high ==> low ?) und mit RCK wird der Inhalt an die Ausgänge durchgeschalten low ==> high oder high ==> low ? Dann noch eine andere Frage angenommen ich will ein Byte raustakten welches ich in einem schieberegister habe, wie lese ich dann immer ein Bit aus dem Byte? Ich weiß schon das man mit ROR ein Byte rotieren kann, aber wie ich dann ns 1. bit komme weiß ich noch nicht MFG Ulrich
Salve, Du hast den dazugehörigen Artikel im Wiki aber auch gelesen, oder? http://www.mikrocontroller.net/wiki/Porterweiterung_mit_SPI Schau mal ins Datenblatt vom ATmega32, Stichwort: SPI. Das Verhalten ist "kompatibel" zu den Shiftregistern. Leitungen verbinden, SPI initialisieren, SPDR schreiben - fertig. Was genau Dein Codeschnipsel machen soll, ist mir leider nicht klar... Werte von 0 bis irgendwas aufwärts und dann wieder abwärts an PORTC ausgeben. Wo besteht da der Zusammenhang zu dem Shiftregister? Wie ein Shiftreg. funktioniert, hast Du doch verstanden. Dann schalte doch die Leitungen einfach mal entsprechend (Datenbit an MOSI, Taktzyklus auf SCK, nach 16 Bits Taktzyklus auf RCK) - bzw. laß es über das interne SPI laufen. Zur letzten Frage: Datenbit vom letzten QH* an MISO, reintakten, Carrybit entsprechend Bit an MISO setzen, ROL/ROR (je nach bitorder) - oder auch hier: SPI nehmen. Das taktet Dir die Daten automatisch ins SPDR (getrennte Register für Schreib-/Lesevorgänge - laß Dich da nicht verwirren). Viel Erfolg, Mark
Ich will es ja nicht über ds SPI Interface machen. Ich habe die 3 Leitungen zum Schieberegister an PortC angeschlossen und weil überhaupt nichts funktionierte, habe ich mit dem geposteten code irgendwelche werte in das schieberegister reingetaktet. Ich würde mich freuen wenn mir jemand einen funktionierenden Codeschnipsel geben könnte welches ganz gezielt 1 Byte ins schieberegister reintaktet. Bei mir funktioniert es einfach nicht
Hallo Ulrich
Hier ist mein Assembler-Code mit dem ich die HC595 ansteuer. Dabei
können die an jeden x-beliebigen Port angeschlossen sein.
; serielle daten an pind 4
; seriell-clock an pind 5
; shift-reg-clock an pind 6
.include "d:\avr\2313def.inc"
.def temp1=r16
.def temp2=r17
.def temp3=r18
.def byte=r19
.equ speicher_0 = 0x060
.equ speicher_1 = 0x061
reset:
ldi temp1, 0
ldi temp2, 0
ldi temp1, ramend :stack einrichten
out spl, temp1
ldi temp1, 0b01110000
out ddrd, temp1
ldi temp1, 0xFF ;testweise
sts speicher_0, temp1
ldi temp1, 0x01 ;testweise
sts speicher_1, temp1
main:
rcall serial_out
rjmp main
serial_out:
cbi portd, 6
lds byte, speicher_0 ;daten aus dem speicher_0 holen
rcall serial_out_start
lds byte, speicher_1 ;daten aus dem speicher_1 holen
sbi portd, 6 ;daten übernehmen
cbi portd, 6
ret
serial_out_start: ;gibt das aktuelle byte seriell aus
rol byte
rol byte ;msb zuerst
ldi temp3, 8
serial_out1:
mov temp1, byte
sbrs temp1, 0
rjmp serial_out11
sbi portd, 4
serial_out11:
sbi portd, 5
cbi portd, 5
rol byte
cbi portd, 4
dec temp3
brne serial_out1
ret
Wenn noch Fragen sind, dann schreib einfach
Gruß Felix
Gerade eben habe ich es selbst hinbekommen, der Fehler war:
-verbindung zwischen 2 Pins
sonstige Fehler:
-Kaputter Ausgang des MC
-Pins vertauscht
Hier mein Programm mit dem ers gerade ging:
.equ SPORT = PORTC
.equ SER = 0
.equ SCK = 2
.equ RCK = 5
ldi temp, 0xF0
ldi temp2, 8
cbi SPORT, SCK
cbi SPORT, RCK
loop_01:
cbi SPORT, SER
sbrc temp, 0
sbi SPORT, SER
lsr temp ; Byte nach rechts schieben
sbi SPORT, SCK
cbi SPORT, SCK
dec temp2
cpi temp2, 0 ; Byte mit '0' vergleichen
brne loop_01
sbi SPORT, RCK
cbi SPORT, RCK
cbi SPORT, SER
Das ist nur für ein Byte, ich werde es wie du geschon programmiert hast
auf 2 Bytes erweitern und im ram speichern... ich poste nacher nomal das
komplette UP wie ich es dann verwende
Danke für die Hilfe ;-)
so und hier auch für andere Leute die was suchen (Verbesserungsvrschläge
bitte mitteilen)
schieberegister:
push temp ; in den Stack legen
push temp1 ; in den Stack legen
push temp2 ; in den Stack legen
ldi temp, 16 ;zaehler verwenden
lds temp1, SREGISTERBYTE_0 ; Daten aus dem SREGISTERBYTE_0 holen
lds temp2, SREGISTERBYTE_1 ; Daten aus dem SREGISTERBYTE_1 holen
loop_01:
cbi SPORT, SER ; SER auf 0 setzen
sbrc temp2, 0 ; Abfrage rechtes Bit=1
sbi SPORT, SER ; dann setze SER
lsr temp1 ; Linkes Byte nach rechts schieben ins Carry
ror temp2 ; Carry in unteres Byte und dabei rollen
sbi SPORT, SCK ; weiter takten
cbi SPORT, SCK ;
dec temp
cpi temp, 0 ; Byte mit '0' vergleichen
brne loop_01
sbi SPORT, RCK ; Ausgänge 595 durchschalten
cbi SPORT, RCK ; RCK auf 0 setzen
cbi SPORT, SER ; SER auf 0 setzen
pop temp2 ; aus dem Stack holen
pop temp1 ; aus dem Stack holen
pop temp ; aus dem Stack holen
cbi PORTA, 2 ; Nur für Anzeige Ob daten versendet wurden.....
reti
aktuell sind es 258 Takte die diese UP benötigt. Bei 8 MHz sind dies
0,03ms. Geht das noch schneller? (Natürlich außer SPI Interface) Wenn
noch jemand vorschläge hat bitte posten...
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.