Atmega8 + sd Karte

Dieses Thema im Forum "Hardware" wurde erstellt von flecralf, 7. September 2013.

  1. flecralf

    flecralf Mitglied

    Registriert seit:
    25. Juli 2013
    Beiträge:
    194
    Zustimmungen:
    2
    Punkte für Erfolge:
    18
    Sprachen:
    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
     
  2. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.700
    Zustimmungen:
    57
    Punkte für Erfolge:
    48
    Sprachen:
    Assembler, LunaAVR, VB.Net, Python, 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:
    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.
     
  3. flecralf

    flecralf Mitglied

    Registriert seit:
    25. Juli 2013
    Beiträge:
    194
    Zustimmungen:
    2
    Punkte für Erfolge:
    18
    Sprachen:
    C
    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ß
     
  4. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.957
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    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...
     
  5. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.195
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    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.

    [​IMG]
    MicroSD card breakout board (Adafruit)

    [​IMG]
    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:
     
  6. flecralf

    flecralf Mitglied

    Registriert seit:
    25. Juli 2013
    Beiträge:
    194
    Zustimmungen:
    2
    Punkte für Erfolge:
    18
    Sprachen:
    C
    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
     
  7. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.195
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    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.
     
  8. wer

    wer Neues Mitglied

    Registriert seit:
    2. Juli 2012
    Beiträge:
    485
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Sprachen:
    Assembler
    Es scheint auch eine FAT32 library in assembler zu geben: hier. Wenn es auf Tempo ankommt?

    Wolfgang
     
  9. flecralf

    flecralf Mitglied

    Registriert seit:
    25. Juli 2013
    Beiträge:
    194
    Zustimmungen:
    2
    Punkte für Erfolge:
    18
    Sprachen:
    C
    Hallo Wolfgang,
    ja gut Tempo ist relativ, aber ich schätze dass es für meine Anforderungen ausreichen sollte.
    Gruß
    Ralf
     
  10. bluelight_electronic

    Registriert seit:
    22. Oktober 2007
    Beiträge:
    319
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Sprachen:
    C, Assembler, Pascal
  11. Hemi

    Hemi Premium Benutzer

    Registriert seit:
    30. November 2008
    Beiträge:
    974
    Zustimmungen:
    9
    Punkte für Erfolge:
    18
    Sprachen:
    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. :)
     
  12. ATmega

    ATmega Neues Mitglied

    Registriert seit:
    3. Juli 2018
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Sprachen:
    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!
     
  13. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.195
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    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();
     
  14. ATmega

    ATmega Neues Mitglied

    Registriert seit:
    3. Juli 2018
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Sprachen:
    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..
     
  15. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.195
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    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 und C++
      uint8_t SPI_RW (uint8_t output)
      {
        uint8_t input;
       
        SPDR = output;                       
        while( !(SPSR & (1<<SPIF)) );               
        input = SPDR;                       
       
        return input;                   
      }     
    
     
  16. ATmega

    ATmega Neues Mitglied

    Registriert seit:
    3. Juli 2018
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Sprachen:
    C
    Benötige ich für das Senden und Empfangen jeweils eine getrennte Funktion oder kann die Funktion auch beides beinhalten?
     
  17. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.195
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    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 und 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                     
                     
    }   
    
     
  18. ATmega

    ATmega Neues Mitglied

    Registriert seit:
    3. Juli 2018
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Sprachen:
    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?
     
  19. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.195
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    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:
     
  20. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.957
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    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

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden