PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eeprom speichern/lesen und über uart daten an excel senden



Eistee
03.05.2008, 14:37
Hallo zusammen,
ich bin in Sachen Microcontroller ein ziehmlicher Neuling, habe mich aber in letzer Zeit stark damit beschäftig und komme bei ein paar Problemen einfach nicht weiter.

Somit ersuche ich die Hilfe der Alwissenden O:)

Grundsätzlich geht es darum, dass ich eine Spannung messe, diese im Eeprom speichere, sie später am PC wieder aus dem Eeprom auslese und dann über ein Hyperterminal(denke es geht nur so, habe Hterm probiert) an Exel übertrage bzw in eine Exel datei speichere.

Ich verwende einen Atmega8 mit 512Bytes EEprom--> 512*8 = 4096bit = 4kbit, also müsste der Eeprom vom Typ 24C04 sein.

mein Grundcode mitdem ich die Spannung messe, was auch gut klappt.

$regfile = "m8def.dat"
$crystal = 3686400



Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2


Admux = &B01100000 'ADC Data Register nach links justieren, ADC0 als Input
Adcsra = &B11100100 'ADC aktiv, dauerhafte Messung, Freeruning Modus,Teilungsfaktor 16

Dim Voltbit As Byte
Dim Volt As Single

Cls
Do
Voltbit = Adch 'kein ADCL auslesen--> 8bit ergebnis--> besser im Eeprom speicherbar
Volt = 5 / 256
Volt = Volt * Voltbit
Lcd Voltbit
Lowerline
Lcd "U= " ; Fusing(volt , "#.##") ; "V"
Waitms 200
Cls

Loop


Werte Testweise ins Eeprom schreiben und auslesen (funktioniert nicht :( )




$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
$hwstack = 32
$swstack = 10
$framesize = 40


Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

'SDA und SCL definieren
Config Sda = Portb.0
Config Scl = Portb.1


Admux = &B01100000 'ADC Data Register nach links justieren, ADC0 als Input
Adcsra = &B11100100 'ADC aktiv, dauerhafte Messung, Freeruning Modus,Teilungsfaktor 16

Dim Voltbit As Byte
Dim Volt As Single

Dim A As Byte
Dim B As Byte
Dim Ausgabe As Byte

Cls
Do
For A = 1 To 10


Voltbit = Adch 'kein ADCL auslesen--> 8bit ergebnis--> besser im Eeprom speicherbar
Volt = 5 / 256
Volt = Volt * Voltbit
'Lcd Voltbit
'Lowerline
'Lcd "U= " ; Fusing(volt , "#.##") ; "V"



'---- schreibe in EEprom ----
'1 bis Überlauf zählen
I2cstart 'Start I2C
I2cwbyte &HA0 'Sende Slave Adresse
I2cwbyte A 'Sende Speicheradresse
I2cwbyte Voltbit 'Sende Wert
I2cstop 'Stop I2C
Waitms 10 'warte 10ms


Lcd " " ; Voltbit ; "ins Eeprom " ' Ausgabe der geschriebenen Werte am LCD
Waitms 500
Next A

'--- lesen vom EEprom ----
For B = 1 To 10

I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte B 'sende Speicheradresse

I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für Lesen
I2crbyte Ausgabe , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C


Lowerline
Lcd " " ; Ausgabe ; "aus dem Eeprom gelesen " 'Ausgabe der EEprom Werte
Waitms 500
Next B


Loop


Beim Schreiben/lesen des EEprom hab ich noch meine Probleme.
Hier zu meinen fragen..

'SDA und SCL definieren
Config Sda = Portb.0
Config Scl = Portb.1

müssen sich diese Befehle genau auf die Ports beziehen, die am MC mit sda,sdl gekenntzeichnet sind?

---------------------------------------
I2cwbyte 0 'H address of EEPROM
I2cwbyte 0 'L address of EEPROM
Was muss ich für Highadress und Lowaddress eingeben(würde mir komisch vorkommen, wenn der wert egal wäre), bzw brauche ich das beim 24C04 überhaupt?

--------------------------------------


Mit welchem Hyperterminal Programm ist es möglich die per Print befehlt über den UART zum PC gesendeten werte am besten direkt in eine exeltabelle umzusetzen?

----------------------------------------
Ich habe vor, per Taster die Messung der Spannungswerte und das Schreiben in den Eeprom beginnt, per Taster wieder beendet wird und mit einem andern Taster die Daten aus dem EEprom gelesen und per Print an den PC geschick werden.

Wie regel ich es am besten, dass nur soviele Werte ausgelesen werden, wie auch reingeschrieben werden?

Gedankengang:Es wird gezählt wie viele Werte geschrieben wurden, diese Anzahl wird an eine bestimmte Speicherstelle(z.B. die erste im eeprom) geschrieben. Diese wird nun ausgelesen und genau so viele weitere Werte ausgelesen wie es der Inhalt der Stelle besagt.

Ich hoffe das Ihr ein paar hilfreiche Tipss für mich habt

O:)

MFG MAX[/code]

Rofo88
03.05.2008, 15:57
Naja wenn Du in den internen EEPROM schreiben willst wie kommst Du darauf das es ein 24C04 sein soll nur weil der die gleiche Speichergröße hat.

Schaue mal nach den Befehlen

WRITEEEPROM
READEEPROM
oder auch "Dim A As Eram Byte "

Eistee
03.05.2008, 20:56
hat jemand vielleicht einen Tipp wie ich die Daten am besten in Excel bekomme?

veit
04.05.2008, 09:17
mit visual basic ein kleines programm schreiben

serialport1.open()
serialport1.readbyte()
...
serialport1.close()

musst dich halt ein bissel einlesen, sollte aber schnell machbar sein

Ronny81
18.06.2008, 00:04
Hallo Max,

anbei eine kleine Tabelle in VBA mit Eventsteuerung, es werden also immer
die Daten am COMport ausgelesen sobald welche im Buffer sind.
Ich habe auch lange noch so was gesucht.

Du musst nur das "NETComm.ocx" in dein VAB einbinden. Da findest du daber genug im Netz. Gruß Ronny.


P.S.
Und noch was zum EEPROM von mir.


' Die gemessene Spannung wird in der Variablen W gespeichert.
' Channel ist der Pin, an dem die Spannung gemessen werden soll.
$regfile = "m32def.dat"
$crystal = 3686400
$baud = 9600

Config Adc = Single , Prescaler = Auto
Start Adc

Config Pinb.0 = Input
Portb.0 = 1

Dim W As Word , T As Single , T2 As Byte , Z As Integer , Z2 As Integer

Do
W = Getadc(0 , 20)
Z = Z + 2
Writeeeprom W , Z 'ADC 0 Adresse 2

W = Getadc(1)
Z = Z + 2
Writeeeprom W , Z 'ADC 1 Adresse 4

W = Getadc(2)
Z = Z + 2
Writeeeprom W , Z 'ADC 2 Adresse 6

W = Getadc(3)
Z = Z + 2
Writeeeprom W , Z 'ADC 3 Adresse 8

W = Getadc(4)
Z = Z + 2
Writeeeprom W , Z 'ADC 4 Adresse 10

W = Getadc(5)
Z = Z + 2
Writeeeprom W , Z 'ADC 5 Adresse 12

W = Getadc(6)
Z = Z + 2
Writeeeprom W , Z 'ADC 6 Adresse 14

W = Getadc(7)
Z = Z + 2
Writeeeprom W , Z 'ADC 7 Adresse 16



Z2 = Z


If Pinb.0 = 0 Then
For Z = 2 To Z2 Step 2
Readeeprom W , Z
Print W
Waitms 100 'sehr wichtig, sonst kommt Excel nicht mit dem Auslesen nach
Next Z
Z = 0
Z2 = 0
End If

Wait 1

Loop
End

dl1akp
18.06.2008, 13:02
Hallo Ronny81,

kannste mir das mal genauer erklären, wie das mit Excel geht? Suche da schon seit Monaten. Egal, was ich bei den beiden Downloads anklicke, es kommen immer nur Fehlermeldungen.

Habe leider keine Informatik studiert, ist mir zu hoch. Gibt es etwas, was man einfach nur anwenden kann???

Danke, Andreas

Ronny81
18.06.2008, 15:27
Hallo Andreas,

ich habe auch nur Heizungsbauer gelernt ;-) .
Man muss eben viel suchen und lesen, dann geht alles!
Also die Downloads funktionieren sicher!
Einfach rechte Maustaste "Ziel speichern unter" uns los.


Bevor du Excel mit dem VBA startest (meine RS232 Mappe) musst du
das Netcomm in VBA einbinden.

http://www.office-loesung.de/ftopic131739_0_0_asc.php

http://www.google.com/cse?cx=006381966387372416808%3Atum9y1qqmcc&q=OCX+einbinden&sa=Archivsuche&cof=FORID%3A0

Mach es so:
http://www.herber.de/forum/archiv/648to652/t650026.htm

einfach nur so geht es am PC leider nunmal nicht ;-)

Gruß Ronny

Ronny81
18.06.2008, 16:10
P.S. hätte ich bald vergessen.
Du muss "MSCOMM32.OCX" auch auf deinem System einbinden damit
"NETComm.ocx" funktioniert.
Verwenden kannst du aber dann nur "NETComm.ocx".

"MSCOMM32.OCX" ist kostenpflichtig und läuft nur wenn du VB auf dem PC hast.

Gruß Ronny

juli
10.09.2008, 13:17
Hi eistee,
im AVR Geschäft bin ich ja recht neu. Habe bisher mit C-Control gearbeitet.
Für C-Control hat B. Kainka ein Buch geschrieben. Messen Steuern Regeln mit Word und Excel. Er verwendet hier zur Datenübertragung eine Dll namens RSAPI.dll. Mit dieser habe ich alle meine Daten von C-Control in Excel und Excel-VBA übertragen. Auf seiner Home page habe ich auch schon eine Rsapi für xp gesehen. Einfach mal googeln und wenns nichts wird mail an mich
mfg.juli