Archiv verlassen und diese Seite im Standarddesign anzeigen : datenaustausch von atmega32 zu atmega32 über spi usw...
roboterheld
14.10.2007, 13: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?
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, 15: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, 16: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, 18: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, 22:31
mit einem array funktioniert es wunderbar. wird wohl die lcd-routine das einlesen ausbremsen.
mfg
linux_80
14.10.2007, 23: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.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.