PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit SPI beim Mega128



Kampi
02.12.2010, 20:36
Hallo

Ich hab ein Problem mit dem SPI von meinem Mega128. Ich hab am SPI Port einen VNC2 USB-Host Controller und eine SD-Karte. Wenn ich den PinE.6 vom Mega128 auf GND lege welcher der Chipselectpin für den VNC ist funktioniert das Programm einwandfrei und der Controller schreibt alle 10 Sekunden den Wert des LM75 auf die SD-Karte.
Wenn ich aber den PinE.6 auf High lege wird im TeraTerm folgender Fehler ausgegeben:
Init: 225
Trying to read File system...
Btemp1: 227
Error: 227 beim Initialisieren des Dateisystems
SD - FEHLER
Ich hab bereits verifiziert das es am VNC2 liegt, weil der mit den Kommandos nichts anfangen kann und deswegen Mist auf den Bus legt.
Das Problem ist folgendes. Leg ich diesen PinE.6 wieder auf 0 schreibt der Controller trotzdem:
nit: 225
Trying to read File system...
Btemp1: 227
Error: 227 beim Initialisieren des Dateisystems
SD - FEHLER
Erst wenn ich den Controller komplett resete indem ich die Spannung wegnehme läuft das Programm wieder normal ab.
Kann mir einer bei dem Problem helfen?
Hier ist übrigends der Code:



'Controller
$regfile = "M128def.dat"
$crystal = 8000000
$baud = 19200

'Stacks
$hwstack = 200
$swstack = 200
$framesize = 400


'TWI konfigurieren
Config Sda = Portd.1
Config Scl = Portd.0
Config Twi = 100000 'TWI Frequenz

'Variablen

'RTC
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Integer
Dim Ds1307w As Byte
Dim Ds1307r As Byte

'LM75
Dim Lm75r As Byte
Dim Lm75high As Byte
Dim Lm75low As Byte
Dim Temperatur As Byte

'SD-Karte
Dim Zu_schreiben As Byte
Dim Tmpbyte As Byte '
Dim Btemp1 As Byte

'Ports
Config Pina.3 = Input 'WP
Config Pina.2 = Input 'CDI
Config Porte.6 = Output 'Chipselect vom USB-Host

Pind.0 = 1 'Pull-up Widerstände aktivieren
Pina.3 = 1
Pina.2 = 1
Porte.6 = 0

'Adresse der DS1307
Ds1307w = &HD0 'Schreibadresse der RTC
Ds1307r = &HD1 'Leseadresse der RTC

'Adresse des LM75
Lm75r = &H9F 'Leseadresse des Temperatursensors


'AVR-DOS einbinden
$include "config_mmc.bas"
$include "config_avr-dos.bas"

'Unterprogramme
Declare Sub Speichern
Declare Sub Init
Declare Sub Uhrzeit
Declare Sub Temperatur


'Voreinstellen der RTC
'Print "Geben sie die korrekten Daten ein:"
'Input "Jahr: " , _year , "Monat: " , _month , "Tag: " , _day
'Print "Geben sie die Uhrzeit ein:"
'Input "Stunde: " , _hour , "Minute: " , _min , "Sekunde: " , _sec

'Einstellen der Zeit
'_sec = Makebcd(_sec)
'_min = Makebcd(_min)
'_hour = Makebcd(_hour)
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 0
'I2cwbyte _sec
'I2cwbyte _min
'I2cwbyte _hour
'I2cstop

'Einstellen der Tage
'_day = Makebcd(_day)
'_month = Makebcd(_month)
'_year = Makebcd(_year)
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte 3
'I2cwbyte _weekday
'I2cwbyte _day
'I2cwbyte _month
'I2cwbyte _year
'I2cstop



'Hauptprogramm
Do

Call Uhrzeit
Call Temperatur
Call Init
Call Speichern
Wait 10

Loop








'************************************************* *****************


'DS1307 auslesen
Sub Uhrzeit
I2cstart 'TWI Start
I2cwbyte Ds1307w 'Übergabe der Slaveadresse
I2cwbyte 0 'Registerzähler wird auf null gesetzt

I2cstart 'Zweite Startkondition
I2cwbyte Ds1307r 'Übergabe der Leseadresse
I2crbyte _sec , Ack 'Auslesen des Sekundenregisters
I2crbyte _min , Ack 'Auslesen des Minutenregisters
I2crbyte _hour , Ack 'Auslesen des Stundenregisters
I2crbyte _weekday , Ack
I2crbyte _day , Ack 'Auslesen des Tagesregisters
I2crbyte _month , Ack 'Auslesen des Monatsregisters
I2crbyte _year , Nack 'Auslesen des Jahresregisters
I2cstop 'TWI Stoppkondition

_sec = Makedec(_sec) 'Umwandlung des BCD-Codes
_min = Makedec(_min) 'in eine Dezimalzahl
_hour = Makedec(_hour)
_year = Makedec(_year)
_month = Makedec(_month)
_weekday = Makedec(_weekday)
_day = Makedec(_day)
End Sub

'LM75 auslesen
Sub Temperatur
I2cinit
I2cstart 'TWI Startkondition
I2cwbyte Lm75r 'Übergabe der Leseadresse
I2crbyte Lm75high , Ack 'Auslesen des Registers für die Temperatur
I2crbyte Lm75low , Nack 'Auslesen des Registers für die Nachkommastelle
I2cstop 'TWI Stopkondition
If Lm75high > 127 Then
Temperatur = Lm75high And 127
Temperatur = Not Temperatur
Incr Temperatur
Else
Temperatur = Lm75high
End Sub
End If


'SD Karte initialisieren
Sub Init
Tmpbyte = Driveinit()
Print "Init: " ; Str(tmpbyte)
Print "Trying to read File system..."
Btemp1 = Initfilesystem(1)
Print "Btemp1: " ; Btemp1

'Fehlerausgabe
If Btemp1 <> 0 Then
Print "Error: " ; Btemp1 ; " beim Initialisieren des Dateisystems"
Waitms 500
Print "SD - FEHLER"
Else
Print "SD OK"
End If
End Sub

'SD Karte beschreiben
Sub Speichern
Open "LOG.txt" For Append As #1 'Erstellen oder öffnen der Log.txt Datei
Print #1 , _day ; "/" ; _month ; "/" ; "20" ; _year ; " " ; _hour ; ":" ; _min ; ":" ; _sec ; " " ; "Temperatur:" ; Temperatur ; "°C"
Close #1
Return
End Sub


Danke für die Hilfe.