PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : datenaustausch von atmega32 zu atmega32 über spi usw...



roboterheld
14.10.2007, 12:50
hallo, ich habe in basocm dieses demo gefunden füer den datentransver von atmega zu atmega mittels spi.... :

Dim A(10) As Byte

Config Spi = Soft , Din =Pinb.0 , Dout =Portb.1 , Ss =Portb.2 , Clock =Portb.3

Spiinit

Spiout A(1), 4 'write 4 bytes a(1), a(2) , a(3) and a(4)

End



wenn ich jetzt einen 2. atmega verbinde (und zb spiin..), wie müssen sich die datenleitungen kreuzen und wie funktioniert der interrupt dazu wenn sich diese routine mit in einer do..loop..schleife befindet?

PicNick
14.10.2007, 14:24
EIner muß Master und einer Slave sein. Danach richten sich auch die Pin-bezeichnungen
z.B Master In / Slave Out => MISO
danach muß du verbinden

roboterheld
14.10.2007, 14:28
CONFIG SPI = HARD, INTERRUPT=ON|OFF, DATA ORDER = LSB|MSB , MASTER = YES|NO , POLARITY = HIGH|LOW , PHASE = 0|1, CLOCKRATE = 4|16|64|128 , NOSS=1|0


wie setze ich beim atmega32(slave) 8mhz diese config und beim atmega8 8mhz master die config ?

mfg

roboterheld
14.10.2007, 15:41
hallo, die programme unten laufen soweit !
bloss auf dem lcd wird immer nur jede 2. zahl angezeigt, je nachdem wo es anfängt zu zählen : 94,96,98.... oder 93,95,97.
woran liegt das?

master :


$regfile = "M8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 64
$baud = 19200

Config Portb.5 = Output
Config Portb.4 = Input
Config Portb.3 = Output
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 64 , Noss = 1
Spiinit

Dim B As Byte

Waitms 255

Do
For B = 93 To 112
Spiout B , 1
Waitms 255
Next
Loop
End


slave :


$regfile = "M32def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 64
$baud = 19200

Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2

Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 64 , Noss = 1
Spiinit
Enable Spi

On Spi Spi_isr

'Interrupt's global aktivieren
Enable Interrupts

Dim B As Byte , Status As Byte

Status = 0

Do
If Status = 1 Then
Cls
Lcd B
Waitms 50
Status = 0
End If
Loop

End


Spi_isr:
Spiin B , 1
Status = 1
Return

linux_80
14.10.2007, 17:52
Hallo,

könnte es sein das der Slave so zu langsam ist :-k
bau mal das Status = 0 gleich nach der If-Abfrage, und evtl. das Waitms 50 raus.

roboterheld
14.10.2007, 21:31
mit einem array funktioniert es wunderbar. wird wohl die lcd-routine das einlesen ausbremsen.

mfg

linux_80
14.10.2007, 22:39
Das Cls wird schon bremsen,
dann muss auch noch die Byte-Variable in einen String gewandelt werden,
und dann nochmal 50ms warten,
und dann erst wird der Status zurückgesetzt, da kann es schon sein, das ein weiteres Byte angekommen ist, das damit verschluckt wird.
Deswegen wärs praktisch als erstes den Status zurückzusetzen, denn dann kann die ISR das nächste Byte anzeigen, bzw. wird von der Abfrage erkannt.