PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupts mit SPI



ElSwallow
05.01.2005, 15:47
Hallo,
habe für mein kleines Roboterprojekt zwei AT90S4433 per SPI verbunden.
Die Kommunikation funktioniert auch, wenn ich die Abfrage des SPI's in einer Schleife ausführe.
Jedoch wenn ich das ganze mit einem Interrupt abfrage, funktioniert die Wertübergabe einmal, danach bleibt der Wert immer gleich.
Jemand 'ne Idee oder ein ähnliches Skript das funktioniert (Master und Slave)???

Gruss L@rs

06.01.2005, 13:36
Hier der Code meines Masters!!!



'*******************SPI-Master ************************************

$regfile = "4433def.dat"
$crystal = 4000000

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 0

sbi DDRB,5 ' SCK output
cbi DDRB,4 ' MISO input
sbi DDRB,3 ' MOSI output


Dim Richtung As Byte 'var ist die Variable die übergeben wird

Spiinit

'********************************Hauptschleife**** ******************************
Main:

Richtung = "r"

Spiout Richtung , 1 'ein Byte senden

Wait 3

Richtung = "v"

Spiout Richtung , 1 'ein Byte senden

Wait 3

Goto Main

'************************************************* ******************************
End 'end program






Und nun der Code meines Slaves (funktioniert so leider nicht )



'*******************SPI-Slave mit Interrupt************************************

$regfile = "4433def.dat"
$crystal = 4000000

Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 0

sbi DDRB,5 ' SCK output
cbi DDRB,4 ' MISO input
sbi DDRB,3 ' MOSI output

Enable Interrupts

Dim Richtung As Byte

On Spi Daten_empfangen

Ddrb = &B11100000

Portd = &B00000000


Spiinit

'**********************************Hauptschleife** ******************************
Main:

Do

Portd = &B00000000

Select Case Richtung

Case "v"

Goto Vorwaerts

Case "r"

Goto Rueckwaerts

End Select

Loop


'******************************Daten_empfangen**** ******************************

Daten_empfangen:

Spiin Richtung , 1

Richtung = "r"
Return


'*******************************Vorwaerts********* ******************************

Vorwaerts:

Richtung = 0 'Zurücksetzen von Richtung

Portd = &B01100000 'Ausgabe an Motortreiber

Wait 3 'solange läuft der Motor

Goto Main


'*********************************Rueckwaerts***** ******************************
Rueckwaerts:

Richtung = 0 'Zurücksetzen von Richtung

Portd = &B10100000 'Ausgabe an Motortreiber

Wait 3 'solange läuft der Motor


Goto Main



End


Hat irgendwer 'ne Idee??? ](*,)

ElSwallow
09.01.2005, 18:09
Hat eigentlich irgendwer schon Erfahrung mit SPI???

Franziskus
09.01.2005, 20:30
Ich habe zwer keine Anung dafon noch nicht !
Kauf dir diese Buch, da wird ales erleutert

AVR- RISC Mikrocontroller
ISBN 3-7723-5476-9

sebastian.heyn
10.01.2005, 08:52
Hi, Hast du noch nen I/O an jedem avr frei? dann könntest du ja über eine extraleitung nen interrupt auslösen!?

PicNick
10.01.2005, 10:19
Hi, für den Slave stell' ich mir den Clock-Pin eigentlich als Input vor.
Du definierst bei Master & Slave als Output.
mfg robert

Edit: hab' ich den SPIINIT übersehen oder isser nicht da ?
Edit2: Widerruf: gut, ich sag nix mehr (neue Brille)