Atmega8 + sd Karte

flecralf

Mitglied
25 Jul 2013
194
2
18
Sprachen
ANSI C
Hallo alle zusammen,
bin gerade bei der Planung eines Datenloggers mit einem atmega8.
Geschrieben werden soll die Ergebnisse auf eine sd-Karte.
Hat jemand einen Minimal-Code zum Einstieg ?
Und, Thema Spannung.... Kann man den atmega mit 3,3 V betreiben ?
Sicher ist die Frequenz da mit von Bedeutung.
Ich würde mir gerne den Levelshifter sparen.
Bin vor lauter Programmieren lötfaul geworden.... :)
Gruß
Ralf
 

TommyB

Team Bitschubse
Premium Benutzer
17 Mai 2010
2.151
80
48
36
127.0.0.1 ;)
Sprachen
C#, VB.Net, LunaAVR, Assembler, Python
Juddn Mor*gähn*

Zur SD Karte kann ich (noch) nichts sagen. Für Beispiele wäre es aber für die Anderen wichtig zu wissen in was für einer Sprache das sein soll.

Zu der Spannung: Der kann auch mit 3,3V betrieben werden. Was die Frequenz angeht schau am besten immer erst in das Datenblatt:
ATmega 8.pdf (SECURED) - Foxit Reader.png
Anhand dieser hoch präzisen Grafik (Ironie) würde ich schätzen 10MHz wäre das Maximum bei 3,3V.

Afaik kann jeder AVR auch mit 3,3V laufen und sollte da auch mindestens mit der höchsten internen Clock stabil laufen.
 

flecralf

Mitglied
25 Jul 2013
194
2
18
Sprachen
ANSI C
Juddn Mor*gähn*

Zur SD Karte kann ich (noch) nichts sagen. Für Beispiele wäre es aber für die Anderen wichtig zu wissen in was für einer Sprache das sein soll.

Zu der Spannung: Der kann auch mit 3,3V betrieben werden. Was die Frequenz angeht schau am besten immer erst in das Datenblatt:
Anhang anzeigen 5899
Anhand dieser hoch präzisen Grafik (Ironie) würde ich schätzen 10MHz wäre das Maximum bei 3,3V.

Afaik kann jeder AVR auch mit 3,3V laufen und sollte da auch mindestens mit der höchsten internen Clock stabil laufen.
Moin moin,
wenn dann in C. Assembler laß ich lieber mal weg, da klemmts bei mir.
10 MHz würden auch ausreichen. Zur Not dann doch mit 5 V und einem Levelshifter.
Frage wäre dann ob ein einfacher Spannungsteiler ausreicht, oder aktiv mit Transistoren oder gar mit einem Max232(heißt das Ding so ???).
Gruß
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.344
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Nein, der Max232 ist ein Pegelwandler 5V-TTL<-->RS232 (+/-12V), wobei der eher so um die +/-10V erzeugt.
Es gibt auch solche Pegelwandler, die von 3,3V-TTL auf RS232 wandeln... aber Dich interessiert ja eigentlich das RS232 gar nicht.

Du willst ja von 5V auf 3.3V wandeln. Dafür gibts andere Pegelwandler/Lavelshifter (siehe TWI oder SPI) - dazu könnten Cassio oder Dino mehr sagen... aber den willst Du ja eigentlich sparen.

Generell kann der 5V-AVR die 3.3V-Pegel problemlos auswerten, in der anderen Richtung sollte ein Spannungsteiler reichen (ggf zusätzlich in Reihe noch ein Strombegrenzungswiderstand, und 'ne Zener gegen Gnd (aber da auf die Kennlinie achten)

Meiner Meinung nach gibt es bereits unter BASCOM fertige Zugriffsroutinen/Dateisystem für solche Karten usw, unter C scheints auch was zu geben - da wird Dirk aber sicher was zu sagen...
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo zusammen,

wenn man VCC 5V nutzt und man sich wegen der Leveltranslator-Sache keinen Stress machen möchte, kann man ja einfach eines der Breakout Boards aus unserem Shop verwenden.


MicroSD card breakout board (Adafruit)


SD/MICRO-SD CARD BREAKOUT MODULE (Itead Studio)



Meiner Meinung nach gibt es bereits unter BASCOM fertige Zugriffsroutinen/Dateisystem für solche Karten usw, unter C scheints auch was zu geben - da wird Dirk aber sicher was zu sagen...
Hier wäre möglicherweise Chans fatFS Module interessant (nutze ich selber auch, allerdings noch nicht in Verbindung mit AVRs). Ob man dies in den kleinen Atmega8 hinein bekommt (SRAM!), weiß ich allerdings nicht. Hierzu vielleicht auch mal eine Suchmaschine nutzen, vielleicht hat jemand damit schon eine fertige Lösung erstellt.

Dirk :ciao:
 

flecralf

Mitglied
25 Jul 2013
194
2
18
Sprachen
ANSI C
Hallo zusammen,

wenn man VCC 5V nutzt und man sich wegen der Leveltranslator-Sache keinen Stress machen möchte, kann man ja einfach eines der Breakout Boards aus unserem Shop verwenden.


MicroSD card breakout board (Adafruit)


SD/MICRO-SD CARD BREAKOUT MODULE (Itead Studio)





Hier wäre möglicherweise Chans fatFS Module interessant (nutze ich selber auch, allerdings noch nicht in Verbindung mit AVRs). Ob man dies in den kleinen Atmega8 hinein bekommt (SRAM!), weiß ich allerdings nicht. Hierzu vielleicht auch mal eine Suchmaschine nutzen, vielleicht hat jemand damit schon eine fertige Lösung erstellt.

Dirk :ciao:
Hallo Dirk,
das Angebot nehme ich gerne an.... allerdings 10 € für den Versand von einem Ort den ich fast täglich durchquere....
da wäre doch sicher auch eine persönliche Übergabe möglich, oder ? :ciao:
Gruß
Ralf
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo Ralf
bin gerade unterwegs deshalb nur kurz ...

für bestellungen unter zehn euro müssen wir diese versandkosten nehmen. Wegen ggf. Abholung kontaktiere ich dich spaeter.
 

wer

Neues Mitglied
2 Jul 2012
485
0
0
Sprachen
Assembler
Es scheint auch eine FAT32 library in assembler zu geben: hier. Wenn es auf Tempo ankommt?

Wolfgang
 

Hemi

Aktives Mitglied
Premium Benutzer
30 Nov 2008
1.030
13
38
Korntal-Münchingen, Germany
Sprachen
ANSI C, C++, PHP, Java
Ich habe schon ziemlich viel in diese Richtung gemacht, ich habe immer die FatFS von elm-chan verwendet. Es gibt noch eine kleinere Implementierung davon und zwar die Petit FatFS. Die ist von der Größe her kleiner und hat aber auch weniger Funktionalität. Hier hängt es davon ab, was man alles machen will.

Die Integration von FatFS ist sehr einfach, man muss lediglich einpaar wenige Funktionen implementieren und schon passt es, also die LowLevel Treiber für RTC und SPI, fertig.

Der Speicherverbrauch richtet sich nach der Anzahl der geöffneten Volumes, Files und ob mit oder ohne Cache, dann halt noch Zeichenkodierung. Ich muss sagen, die Lib ist echt geil.

Auf meinem ARM reize ich die USB-Schnittstelle vollständig aus.

@LevelShifter: Ich habe noch einpaar von den TXS0108 rumliegen, auf einem BreakOut-Board. Wenn Du welche brauchst --> sag Bescheid :) Oder halt eben die BreakOut-Board aus dem Shop. :)
 

ATmega

Neues Mitglied
3 Jul 2018
8
0
1
Sprachen
ANSI C
Hallo,

ich arbeite derzeit an einem ähnlichen Problem.
Ich möchte Daten vom ATmega8 auf einer SD-Karte speichern.
Dafür benötige ich nur wenige Funktionen und habe mich deshalb für die Petit FatFS Version entschieden.
Leider bekomme ich diese nicht zum laufen. Fehler werden keine mehr angezeigt aber funktionieren tut das Programm auch nicht.

Habt ihr Tipps? Welche Teile der Bibliothek muss ich ändern?

Vielen Dank für Eure Hilfe!
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Habt ihr Tipps? Welche Teile der Bibliothek muss ich ändern?
Willkommen in unserer Community :)

Bei dir fehlen wahrscheinlich noch die lowlevel-Funktionen.

Schau dir mal diskio.c an. Hast du zum Beispiel in disk_initialize() deinen Code für SPI und ChipSelect eingefügt? Falls nicht, schau dir am besten auf der Seite elm.chan.org das Beispiele an (für avr).
elm-chan.org/fsw/ff/pfsample.zip

Übernehme die Funktionen aus dem Beispiel und definiere die lowlevel-Funktionen für deinen Mikrocontroller ...
(Für alle Funktionen in diskio.c)

init_spi();
SELECT();
DESELECT();
rcv_spi();
xmit_spi();
 

ATmega

Neues Mitglied
3 Jul 2018
8
0
1
Sprachen
ANSI C
Übernehme die Funktionen aus dem Beispiel und definiere die lowlevel-Funktionen für deinen Mikrocontroller ...
(Für alle Funktionen in diskio.c)

init_spi();
SELECT();
DESELECT();
rcv_spi();
xmit_spi();[/QUOTE]

Hallo Dirk,
init_spi(), SELECT und DESELECT sollte ich hinbekommen.
Allerdings ist mir nicht ganz klar was die beiden Funktionen rcv_spi und xmit_spi tun. Dachte zuerst, dass die eine Funktion für das Senden und die andere fürs Empfangen ist.
In den Kommentaren steht aber was anderes..
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Allerdings ist mir nicht ganz klar was die beiden Funktionen rcv_spi und xmit_spi tun. Dachte zuerst, dass die eine Funktion für das Senden und die andere fürs Empfangen ist.
Ja das ist auch so.

Im Beispiel sind beide Funktionen in usi.s enthalten, also in Assembler realisiert. Das kannst du auch in C machen. Ich habe jetzt leider kein Beispiel für die ATmega8 Hardware zur Hand.

Prinzipiel sieht es bei Hardware SPI so aus ...
(ersetzt beide obige Funktionen für Senden und Empfangen. Wird bei ATmega8 ähnlich oder genau so sein.)


CodeBox C
  uint8_t SPI_RW (uint8_t output)
  {
    uint8_t input;
   
    SPDR = output;                       
    while( !(SPSR & (1<<SPIF)) );               
    input = SPDR;                       
   
    return input;                   
  }     
 

ATmega

Neues Mitglied
3 Jul 2018
8
0
1
Sprachen
ANSI C
Benötige ich für das Senden und Empfangen jeweils eine getrennte Funktion oder kann die Funktion auch beides beinhalten?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Die Funktion kann auch beides machen. Es muss der Funktion nur grundsätzlich dann auch ein Parameter übergeben werden, auch wenn du nur empfangen möchtest.

Du kannst aber auch beides trennen, das würde dann in etwa so aussehen ...



CodeBox C
uint8_t SPI_Read (void)
{
  uint8_t input;
 
  SPDR = 0xFF;                       
  while( !(SPSR & (1<<SPIF)) );               
  input = SPDR;                       
 
  return input;                   
}     

void SPI_Write (uint8_t output)
{
  uint8_t input;
 
  SPDR = output;                       
  while( !(SPSR & (1<<SPIF)) );               
  input = SPDR; // dummy                     
                 
}   
 

ATmega

Neues Mitglied
3 Jul 2018
8
0
1
Sprachen
ANSI C
Ich habe die Funktionen nun angepasst und das diskio.c ergänzt.
Leider macht das SCK-Signal gar nichts, wenn ich es mit dem Oszilloskop messe.
Woran kann das liegen?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Die Ursache dafür kann an vielem liegen. Von "der MC erhält keinen Systemtakt" bis hin zu "SPI Modul wird nicht initialisiert oder SPI Funktionen werden gar nicht aufgerufen".

Wenn kein SPI Clock vorhanden ist, würde ich die SPI Funktionen zunächst überprüfen.

In main() nach dem Initialisierungsbereich (vor SD Zugriff) die Initialisierungsfunktion für das SPI Modul aufrufen und danach einfach in einer Testschleife permanent senden und das SCK Signal prüfen.

Dirk :ciao:
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.344
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Nur mal ein paar Fallstricke:
Du wirst den Mega als SPI-Master initialisiert haben, MISO ist automatisch Eingang. Über das Portregister kannst Du trotzdem den Pullup ansteuern.
Für MOSI, SCK und /SS mußt Du selbst die Datenrichtung festlegen.
Wenn SS Eingang ist und low wird, wechselt der AVR automatisch in den Slavemode.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)