PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom und SQL-Datenbanken



HAL9999
20.01.2008, 20:32
Hallo,

Dieses Thema handelt von einem Versuchsaufbau, bei dem Daten (Nr, Zeit und Frequenz) eines Hall-Sensors sequentiell in eine Datenbank-Tabelle geschrieben (und später auch ausglesen) werden sollen. Ich möchte mit BasCom und dem RNFRA-Board Mega32 von Roboternetz Signale des Sensors in eine Datenbank speichern. Gibt es dafür eine performante Lösung wie z. B. sequentielle Textfiles (Key/Indizierung wird nicht benötigt) oder eine SQL-Datenbank-Anbindung (ODBC) o. ä.? Hat jemand dazu evtl. ein Code-Beispiel?

Wenn es möglich und evtl. performanter ist, sollten die aufgezeichneten Daten auf dem Speicherbaustein des Controllerboards gespeichert werden, sodass die Schaltung autonom (ohne Laptop) arbeiten kann. Je nachdem was performanter wäre...

Bin für jedes Feedback sehr dankbar.

Gruss Euer
Sascha

python_rocks
20.01.2008, 22:42
Versuchsaufbau, bei dem Daten (Nr, Zeit und Frequenz) eines Hall-Sensors sequentiell in eine Datenbank-Tabelle geschrieben (und später auch ausglesen) werden sollen.
Hallo Sascha!

Der ATmega32 besitzt einen 1024 Byte großen EEPROM. In diesem kann man Daten schreiben. Das könnte schneller sein, als diese über die Serielle Schnittstelle zu einem Computer zu übertragen.

Die maximale Baud-Rate für die Übertragung zum Computer ist 115200. Dafür brauchst du aber einen anderen Quarz (73728 oder 147456 Hz) um diese Baudrate fehlerfrei fahren zu können. Ich kenne dein Board nicht. Deshalb weiß ich auch nicht, welche Probleme auftauchen können, wenn man den Quarz tauscht.

Bei 115200 Baud kannst du vom µC zum Computer 11520 Bytes/Sek. übertragen. Das ist für den Computer sicher kein Problem. Darum brauchst du dich also nicht kümmern.

Egal welche Programmiersprache du einsetzt. Es gibt nichts was schneller ist, als Daten an eine normale Textdatei anzufügen. Jede Datenbank ist erheblich langsamer. Du musst also nur ein Programm schreiben, welches den Text, den es über die Serielle bekommt, an eine Textdatei anfügt.

Ich persönlich verwende Python http://python.org/ und pySerial http://pyserial.sourceforge.net/ für solche Aufgaben.

Noch schneller ist es, wenn du die Daten natürlich nicht sofort zum Computer übertragen musst. Dann kannst du die Daten in einen EEPROM schreiben und später wieder auslesen. Nur die Programmierung ist dann erheblich aufwändiger und du müsstest einen externen EEPROM verwenden, da der in den ATmega32 eingebaute EEPROM wahrscheinlich zu klein für deine Datenmenge ist.

Wie oft in der Sekunde muss eine Messung durchgeführt werden? Welche Datenmenge fällt an? Wie lange muss eine Messreihe laufen? Rentiert sich der Aufwand, nicht sofort alles über eine Serielle Schnittstelle zum Computer zu übertragen? Wie misst du die Frequenz?

mfg
Gerold
:-)

python_rocks
20.01.2008, 22:51
Hallo Sascha!

Ein einfaches Python-Programm, welches die Daten von der Seriellen in eine Textdatei schreibt, sieht so aus:


#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import serial

try:
datafile = file("daten.txt", "a") # append
try:
ser = serial.Serial(
port = "COM1", baudrate = 115200, bytesize = 8, parity = 'N',
stopbits = 1, timeout = 3,
)
try:
while True:
line = ser.readline().rstrip()
if line:
datafile.write(line + "\n")
finally:
ser.close()
print "serial connection closed"
finally:
datafile.close()
print "datafile closed"
except KeyboardInterrupt:
# Programm wird mit STRG+C beendet
print "exit"

mfg
Gerold
:-)

pmaler
21.01.2008, 16:15
Als Datenbank-Fuzzi, der sich nebenher mit myController befasst würde ich aus dem Bauch heraus folgende Variante zur Lösung heranziehen:

1. Atmel sammelt Daten
2. Atmel schreibt auf eine SD-Card, denn das geht auch mit BasCom
3. Ausgabe sequentiell als Datenstream, wie in eine Textdatei. Ist am schnellsten
4. Wenn Messung erfolgte, wandert die SD-Card in den PC, der sich die Daten dann reinzieht, indem er die Textdatei zerpflügt.

So würde ich es angehen, denn es sind alle gewünschten Parameter gegeben. Portabilität (Batteriebetrieb), Unabhängig vom PC, Massenhaft Platz für Massenhaft Daten. Verarbeitung der gesammelten Daten erfolgt Offline, also keine Probleme wegen Verbindung Atmel <-> PC

HAL9999
21.01.2008, 19:35
Vielen Dank für die Antworten. Eine Frage an pmaler: Wie sieht denn so ein Schreib-Befehl für eine SD-Karte aus? Ist es "Open file etc..." oder gibt es dafür spezielle Anweisungen? Kann man als SD-Kartenleser für dieses Board irgend einen (v. z.b. Conrad elektronic) nehmen oder hast Du dafür eine bessere Quelle (wenn möglich m. link)?
Gruss
Sascha

pmaler
21.01.2008, 19:48
Schau mal bei Ulrich radig vorbei, der hat da die minimal beschaltung für Dich: http://www.ulrichradig.de/home/index.php/avr/mmc-sd

Und wenn du Bascom und DOS mal bei den goggl-jungs eingibst, kommst Du als erstes zu http://members.aon.at/voegel welches direkt in Bascom von http://www.mcselec.com übernommen wurde und mittlerweilen bei der Vollversion mit dabei ist. Siehe http://www.mcselec.com/index.php?option=com_content&task=view&id=20&Itemid=41

Du siehst, es ist bereits alles erfunden und geklärt. Man muss es nur noch einbinden, die 3,3 Volt bereit stellen, ein paar Ports anbinden und zusammenlöten.

Alleine der SD-Card Slot... Will man dieses Miniding, was vermutlich 0,1 Cent wert ist, einzeln kaufen, dann muss man 7-8 Euronen abdrücken.

Ab einer Menge von 10000 Stück, sinkt der Preis auf normales Niveau.
Hab bei microcontroller.net nachgelesen. da ist es billiger einen USB-SD-Card-Stick beim uns allen bekannten Internet-Aultionshaus zu kaufen und den SD-Slot auszulöten, als das Teil extra zu kaufen.
Eine perverse Preisgestaltung ist das manchmal.

HAL9999
21.01.2008, 23:22
Vielen Dank für die Infos, die haben mir sehr gut weitergeholfen.
Danke und viele Grüsse
Euer Sascha

mull
29.01.2008, 17:15
Also ich habe das Programm jetzt in Python eingegeben, aber der sagt immer:

Traceback (most recent call last):
File "C:\Python25\datenancom1speichern", line 4, in <module>
import serial
File "C:\Python25\lib\site-packages\serial\__init__.py", line 13, in <module>
from serialwin32 import *
File "C:\Python25\lib\site-packages\serial\serialwin32.py", line 9, in <module>
import win32file # The base COM port and file IO functions.
ImportError: No module named win32file


Was sagt mir das jetzt

python_rocks
29.01.2008, 18:41
Hallo mull!

pyserial braucht pywin32 um arbeiten zu können: http://downloads.sourceforge.net/py.....win32-210.win32-py2.5.exe

mfg
Gerold
:-)

HAL9999
01.04.2008, 18:02
Hallo,
habe nun die Schaltung nach folgendem Schaltplan fertig gelötet (war gar nicht so einfach anstelle der SMD-Transistoren normale Transistoren, die das gleiche machen, zu finden.
http://www.ulrichradig.de/site/atmel/avr_mmcsd/gfx/MMC_Optimal.JPG
Aber nun habe ich folgende 2 Probleme:
- da gibt es ja bei dem Roboter-Netz-Bus (RNB-BUS) die Möglichkeit etwas an die AVR-Pins Anzuschliessen - jedoch finde ich, die auf dem Schaltplan angegebenen Pins nicht auf dem RNB-BUS.
- Ausserdem finde ich nirgens beschrieben, wie herum und in welche Richtung die Pins des RNB-Bus gezählt werden (also soetwas wie z.B. pin 1 ist unten rechts und wird nach links gezählt ... oder ähnliches)
- wo liegt eigentlich bei der Schaltung der Unterschied zwischen VCC und VCC_3V?

Bräuchte also ein Mapping vom Schaltplan der MMC-Karte (was wo dran kommt) zum RNB-Bus sowie eine Abbildung (oder in Textform) des RNB-Busses wo drauf zu sehen ist, wie die Pins angeordnet sind.

Eine Jpg-Datei von den Pin-Erläuterungen des RNB-Bus hab ich als Anlage beigefügt (SPI_... hab ich im oberen drittel schon gefunden - hab aber keine idee wo davon was dran kommt...).

Vielen Dank und viele Grüße

Euer Sascha

HAL9999
01.04.2008, 23:30
Hallo,
eine Frage hab ich da noch:
- weiss jemand, ob ich den SPI-Modus im AVR-Dos für die MMC-Karte irgendwo setzen bzw. einschalten muss (Damit der read/write-befehl weiss, dass die Daten auf die Karte gehen sollen)?

Wenn ja, wie genau geht das mit Bascom/Basic (bei Uhrig Radig war der Code für die MMC-Karte in C geschrieben - und damit kann Bascom/Basic wohl nix anfangen...)?

Vielen Dank für Eure Zuschriften an dieser Stelle.

Gruss
Euer Sascha

HAL9999
08.04.2008, 11:01
Hallo,

habe das Test-Beispiel von AVR-Dos versucht für meinen ATMEGA32, wie es dort beschrieben ist, zu compilieren. Dabei kommt immer die Meldung: Out of SRAM. Egal wie ich den Code aus dem Beispiel einkürze (Nur init, open, print #1.., close etc.) - es ist immer die gleiche Fehlermeldung. Hat jemand AVR-DOS auf einem ATMEGA32 evtl. schon zum laufen bekommen? Wenn ja, was muss dort im Code angegeben werden? Habe es auch mit "$default Xram und $default Sram" versucht, nachdem ich das im Microcontroller-Forum gefunden habe. Der Compile lieferte dann keine Fehler wegen SRAM mehr, aber beim hochladen auf den Chip gab es dann die Fehlermeldung, dass der Chip nicht mit einem ATMEGA32 übereinstimmt.

Hier ist mein kurzes Test-Beispiel:



$regfile = "m32def.dat"
$crystal = 8000000
$xramstart = &H300
$xramsize = &H10000
$default Xram
$include "samples\avrdos\Config_MMC.bas"
$include "Config_AVR-DOS.bas"
$default Sram

Dim S As String * 20
Dim Wsrampointer As Word
Dim W As Byte
Dim Xxx As Byte
Dim Sektor As Long

Xxx = Initfilesystem(1)
W = 122
Open "abc.txt" For Input As #1
Input #1 , S
Print #1 , "lkjlkjlkjlkj"
Close #1

End


Habe nun folgende Gedanken:

Funktioniert AVR-DOS überhaupt mit einem MEGA32 oder muss ich mein RNBFRA-Board irgendwie mit einem ATMEGA128 oder MEGA2560 upgraden? Wenn ja, was ist dafür empfehlenswert (zusatzboard mit MEGA2560 wie im Robotikshop erhlältlich ans RNBFRA anschliessen? Wenn ja, woran schliesst man das Zusatzboard am RNBFRA an (SPI, RNB-BUS, I2C-Bus)?
- Oder -
Kann man dem Mega32 evtl. mehr SRAM spendieren z.B. durch externe Speichermodule oder kann man einen SRAM-/Speicher-Chip auf dem RNBFRA-Board austauschen?
- Oder -
Wäre es möglich den ATMEGA32 aus dem Board herauszunehmen und Ihn gegen einen Mega128 (durch z.B. eine selbstgelötete Schnittstelle) zu ersetzen?

Vielen Dank schon mal für Eure Replys.
Gruss
Sascha

MeckPommER
08.04.2008, 11:21
AVR-DOS läuft ohne Probleme auf einem MEGA32, allerdings ist die Datei "Config_AVR-DOS.bas" anzupassen. Um SRAM zu sparen sollte der Parameter cFileHandles = 1 gesetzt werden und cSepFATHandle = 0.

Beide Angaben sind direkt am Anfang der Datei zu finden.

Weiteres fällt mir nicht ein, da ich dein Board nicht kenne.

Gruß MeckPommER

HAL9999
09.04.2008, 10:21
vielen Dank für die Info - jetzt kommt die Meldung mit dem sram nicht mehr auch wenn ich den folgenden code (den ich gefunden habe) auskommentiere:

'$xramstart = &H300
'$xramsize = &H10000
'$default Xram
'$default Sram

Habe das Programm dann versucht auf den AVR zu schreiben - da kam die Fehlermeldung mit dem "Not match Chip ... <> Mega32" wieder. Habe dann die Optimale Anbindung der MMC-Karte vom RNB-BUS (genauer: SPI-Bus, +5V und GND vom RNB) wieder abgezogen und dann versucht das Programm auf den Chip zu schreiben - da hat es funktioniert. Ist es normal, dass man den Chip nur Programmieren kann, wenn am SPI-Bus nichts hängt? Oder hat die Schaltung evtl. zuviel Strom vom Board gezogen, sodass der AVR nicht mehr genug hatte?
Als ich nachdem erfolgreichen Proggen des AVR dann die MMC-Karte mit der Schaltung wieder angeschlossen und das Board angeschaltet habe, ist auf der Karte nichts passiert (habe Sie vorher frisch mit FAT16 Formatiert).
Jedenfalls hätte doch dort, ein Textfile abc.txt mit dem Inhalt 'lkjlkjlkjlkj' erwartet. Doch die Karte war noch leer.
Woran kann es nun liegen:
- soll ich die Karte mal ohne schaltung (Optimale Anbindung von Ullrich Radig wie oben angegeben) an den SPI anschliessen und die Karte nur mit Spannungsteiler (wg. 3,3V) versorgen?
- Oder liegt es daran, dass ich den Strom vom RNB-Bus genommen habe?
Gruss
Sascha

HAL9999
09.04.2008, 20:40
habe jetzt die Karte mal ohne die Schaltung "optimale Anbindung von Ullrich Radig" angeschlossen (so wie es im Pdf: Update für AVR-DOS Release 5 und auch in der Config_mmc.bas beschriefen ist)
und die Karte mit 3,3V versorgt. Jetzt kann ich den Chip Programmieren wenn die Karte angeschlossen ist. soweit so gut - aber auf der karte stehen immer noch keine daten. habe in der config_mmc.bas auch mal den schalter Cmmc_soft = 1 gesetzt. jedoch tat sich da auch nichts. habe die Datei abc.txt dann manuell angelegt. Aber da tat sich auch nichts. Den schalter habe ich dann wieder auf 0 gesetzt - tat sich auch nichts - der text wird einfach nicht in das txt-file auf der karte geschrieben. Hat jemand evtl eine Idee hierzu? Kann ja eigentlich nur noch am code liegen, oder? Hat jemand die karte so wie ich direkt am Spi des AVR und nutzt AVR-DOS?
Hier ist nochmal mein aktueller code:


$regfile = "m32def.dat"

$crystal = 8000000 'Quarzfrequenz
$baud = 9600

$hwstack = 64
$swstack = 256
$framesize = 64

$include "Config_MMC.bas"
$include "Config_AVR-DOS.bas"

Dim S As String * 20
Dim Xxx As Byte

Xxx = Initfilesystem(1)
Open "abc.txt" For Input As #1
Input #1 , S
Print #1 , "lkjlkjlkjlkj"
Close #1

End

HAL9999
09.04.2008, 21:46
Bei dem beigefügten Bild "pinoutsMEGA32.jpg" sieht man SS, MOSI, MISO und SCK des AVRs.
An diese Pins habe ich die Karte auch gemäss der Beschreibung auf der 2. Seite des PDF
"MMC-SD-ANBINDUNGUpdate-Info_de"
angeschossen.

pinNr.........MEGA32.......KARTE
---------------------------------------
5. pin........SS..............an CS
6. pin........MOSI..........an DI
7. pin........MISO..........an DO
8. Pin........SCK...........an SCLK

Direkt an der Karte messe ich auch 3,30 Volt da wo sie sein müssen und
GND der Karte geht auch an den GND des AVR.
Es kann eigentlich nur noch am Quellcode liegen oder sieht hier jemand einen anderen Fehler (z.B. Pinbelegung). Was ist eigentlich die Durchnummerierung PB0 - PB3 am AVR (1.Pin -4.Pin) heisst das PortB.0 - PortB.3? Wenn Ja, dann ist die Beschreibung mit dem SPI-Bus (MISO, MOSI,SS, CLK irreführend bzw. falsch) oder ich irre mich beim Interpretieren von PB0 (SCK/T0) = PortB.0 etc...

Kann hier jemand seinen Code für eine MMC-Karte mal posten?
und an welche Pin-Nummer des AVR was angeschlossen ist?

Danke und Gruß
Sascha

HAL9999
14.04.2008, 23:14
habe jetzt die minimale beschaltung gelötet und angeschlossen. leider tut sich da auch nichts - habe eine 64mb eine 512mb und eine 1gb katrte getestet- jedoch bleibt die karte und die abc.txt immer leer.
habe dann auch folgendes probiert:
in der Config_mmc.bas an dieser stelle die pins für den spi-bus des mega32 angepasst (denn ich habe sie an den pins 4-7 angeschlossen wie oben auf der pinbelegung zu sehen ist.)


' --------- Start of Section for Soft-SPI --------------------------------------

' Chip Select Pin => Pin 1 of MMC/SD
Config Pinb.4 = Output
Mmc_cs Alias Portb.4
Set Mmc_cs

' MOSI - Pin => Pin 2 of MMC/SD
Config Pinb.5 = Output
Set Pinb.5
Mmc_portmosi Alias Portb
Bmmc_mosi Alias 2

' MISO - Pin => Pin 7 of MMC/SD
Config Pinb.6 = Input
Mmc_portmiso Alias Pinb
Bmmc_miso Alias 3

' SCK - Pin => Pin 5 of MMC/SD
Config Pinb.7 = Output
Set Pinb.7
Mmc_portsck Alias Portb
Bmmc_sck Alias 1


hat aber auch nichts gebracht...
habe auch spi soft und ohne ausprobiert.
sogar mit c:\abc.txt und ohne c:\
- jecoch alles erfolgos

hat jemand eine idee, woran es noch liegen könnte?

Gruss
Sascha

HAL9999
14.04.2008, 23:16
und hier ist der code von meinem aktuellen versuch:


$regfile = "m32def.dat"

$crystal = 8000000 'Quarzfrequenz
$baud = 9600

$hwstack = 64
$swstack = 256
$framesize = 64

$include "Config_MMC.bas"
$include "Config_AVR-DOS.bas"

Dim S As String * 20
Dim Xxx As Byte

Xxx = Initfilesystem(1)
Open "c:\abc.txt" For Output As #1
Print #1 , "lkjlkjlkjlkj"
Close #1

End

HAL9999
16.04.2008, 14:56
- ist ein "c:\" bei MMC-SD Karten in Bascom nötig oder überflüssig?
- war es richtig, die PINs und PORTS wie oben beschrieben von 0-3 auf 4-7 zuändern oder war das falsch?
- hat jemand das AVR-DOS mit einem ATMega32 und einer MMC-SD-Karte schon mal zum laufen bekommen und könnte hier einen Bascom-Code posten sowie, das was in der Config-MMC.bas steht und an welchen Bereich der Pins ( Pin 1 - 4 oder Pin 5 - 8 würde mir reichen) die Schaltung angeschlossen ist?
Gruß
Euer Sascha

HAL9999
23.04.2008, 13:23
Ok, hab den Fehler gefunden- es läuft jetzt und schreibt auch in die Datei.
Es lag daran, dass ich noch die anderen Pinb.... im Config_MMC.bas auf pinb.4 - 7 zu ändern. Also zu den noch offen fragen oben kann ich beantwortend sagen, dass ein C:\ (wie in manchen programmcodes gefunden) nicht nötig ist. Die Pins muss man für einen ATMEGA32 allerdings von 1-4 auf 5-8 in der Config_mmc.bas ändern...

Wichtiger Hinweis:
---------------------------
Ausserdem muss man dann das Board nach dem Flashen vom Strom trennen ca 2 sek. warten und es dann wieder mit strom versorgen. Danach ca 7 sek warten bis das Board die Befehle ausführt. Trennt man es nicht nach dem flashen vom strom dann bekommt man beim initfilesystem(1) den Returncode 277. Hat übrigens auch wegen einer nagelneuen 512-MB MMC-Karte von HAMA nicht funktioniert - dafür aber mit einer 5 Jahre alten 64 MB-Karte.
Gruß
Sascha

HAL9999
23.04.2008, 13:30
Nachtrag die Pin und Portangaben - nicht jedoch die Alias angaben!
Gruß
Sascha