mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ISP per software SPI


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche verzweifelt hier einen Atmega8 von einem Mega644 aus per 
ISP zu programmieren. Die Programmierung soll dabei per Software SPI 
erfolgen.

Leider bringt mir der Mega8 statt dem (0x53 == ich bin in den 
programmiermodus versetzt worden) immer nur 0xff zurück :-/
Inzwischen frage ich mich schon in welchem Modus programmiert wird, laut 
meinem Mega8 datenblatt sampelt er bei der Taktflanke low->high

Meine Routine wie folgt:

Routine um ein Byte per Softspi zu senden und gleichzeitig das zu lesen, 
welches der slave in dem Moment zurückschickt. (die ganzen SX_... makros 
sind richtig definiert und bewirken auch das richtige.)
//############################################################################
unsigned char softspi_rwb (char byte, uint8_t n)
//############################################################################
{
        // n = softspi nummer
        char ret;

        for (unsigned char a=8; a>1; a--) { // MSBit first
            if (byte & (1 << (a-1))) {
                *(SX_MOSI_PORT[n]) |= SX_MOSI_PIN[n]; //Mosi = 1
            } else {
                *(SX_MOSI_PORT[n]) &= ~(SX_MOSI_PIN[n]); //Mosi = 0
            }

            // Takt High  (Ein Bit senden/Empfangen)
            *(SX_SCK_PORT[n]) |= SX_SCK_PIN[n];

            // Jetzt kann gültiger Status gelesen werden
            if (*(SX_MISO_PORT[n]) & SX_MISO_PIN[n]) {
                ret |= (1 << (a-1));
            } else {
                ret &= ~(1 << (a-1));
            }

            // Takt Low  (Bit übernommen)
            *(SX_SCK_PORT[n]) &= ~(SX_SCK_PIN[n]);
        }
        return ret;
}
Angesteuert das ganzen dann via

    char temp;
    //set Chip_Select to high (INAKTIV)
    *(SX_SS_PORT[n]) |= SX_SS_PIN[n];

    //set Chip_Select to low (Aktiv)
    *(SX_SS_PORT[n]) &= ~(SX_SS_PIN[n]);

    // Takt Low
    *(SX_SCK_PORT[n]) &= ~(SX_SCK_PIN[n]);

    // Reset Toggle
    *(SX_RES_PORT[n]) &= ~(SX_RES_PIN[n]);
    _delay_ms(1);
    *(SX_RES_PORT[n]) |= SX_RES_PIN[n];
    _delay_ms(1);
    *(SX_RES_PORT[n]) &= ~(SX_RES_PIN[n]);

    for (int i = 0; i < 20; i++) _delay_ms(1);

    temp = softspi_rwb(0xAC, n);
      //temp ist dann 254
    temp = softspi_rwb(0x53, n);
      //temp ist wieder 254
    temp = softspi_rwb(0x00, n);
      //temp ist wieder 254

    if (temp == 0x53) {
        #ifdef _UDPDEBUG_
                udpLog("programming mode Success ", n);
        #endif
    } else {
        #ifdef _UDPDEBUG_
                udpLog("no answer from controller ", temp);
        #endif
        return 1;
    }


naja, leider funktioniert das so nicht. Gibts irgendwo ein Beispiel, wo 
jemand sowas schon implementiert hat? Laut datenblatt und verschiedener 
PDFs sollte das so klappen :-/

Vielen Dank!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch einfach mal in die Sourcecodes
von USBProg oder anderen USB Programmern
rein.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollte nur nochmal ne Rückmeldung geben für andere mit dem selben 
Problem:

die Zeile
for (unsigned char a=8; a>1; a--) { // MSBit first

in
for (unsigned char a=8; a>0; a--) { // MSBit first


ändern und es klappt... Ein byte hat halt doch 8 bit ;) Danke Oscar ;)


Lg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.