- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: CPU wird langsamer, Fusebits falsch ???

  1. #1
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    47
    Beiträge
    68

    CPU wird langsamer, Fusebits falsch ???

    Anzeige

    E-Bike
    Nabend zusammen

    Das Problem beschäftigt mich schon eine Weile.
    Ich habe mittels AT Mega 32 und 128 eine eigene SPS zur Steuerung meiner Modellbahn gebaut. HIer die unterschiede ja nach geforderter Rechenleistung
    Beide laufen mittels Quarz 8 und 16 Mhz.

    Hauptsächliche habe ich das Problem wenn ich mit dem I2C Bus arbeite und mehrere Portbausteine anspreche (MCP23017) die CPU merklich langsamer wird.
    Das ganze erkennt man, das ein RUn led die ganze Zeit blinkt. Diese wird deutlichen "träger".

    Hauptsächlich wirklich dann wenn ich I2C Routinen zb für die Ausgabe programmiere.

    Meine Frage ist, ob jemand mal die korrekte Fusebits Einstellung hat für 8 und 16 Mhz Betrieb, im Datenblatt und auch im Netz bin ich nicht wirklich so fündig geworden.
    Ich hatte mal gelesen das bei Falscher Taktrate dieses Phenomon eintreten kann.

    ich programmiere meine CPus mit PonyProg bzw Übertrage damit meine Programme.

    Danke im Voraus
    Patrick

  2. #2
    shedepe
    Gast
    Wenn deine I2C Routinen entsprechend lange brauchen wird dein Blinken in der Mainloop zwangsläufig langsamer (Der Controller macht ja was anderes). Das hat nichts mit den Fuses zu tun: Zum berechnen der Fuses lohnt sich das Tool hier: http://www.engbedded.com/fusecalc/

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.684
    .. mittels AT Mega 32 und 128 eine eigene SPS .. wenn ich mit dem I2C Bus arbeite .. die CPU merklich langsamer wird ..
    Hallo Patrick,

    welche Taktrate hast Du denn beim I²C eingestellt? Und wie groß/lang/umfangreich (so ungefähr wenigstens) sind denn Deine gesendeten/ausgetauschten Datenpakete ?
    Ciao sagt der JoeamBerg

  4. #4
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    47
    Beiträge
    68
    Nabend

    Für den I2C Bus verwende ich die Einstellungen von Codevision. das sind soweit ich weiss 100 Khz..aber ich will mich nicht festlegen, muss auch sagen habe mir das meiste selber
    erarbeitet daher, wenn es lief war es ok..es gibt bestimmt natürlich bessere wege zum Ziel.

    Ich habe für die beiden Ports des MCP23017 eine Additionsroutine geschrieben damit ich jeden einzelnen Pin über eine Interne Variable ansprechen kann.
    Diese bIts haben immer die wertigkeit 1,2,4, 8..bis 128 und werden wenn sie beschrieben werden addiert und auf den Port gelegt.
    Ich vermute das diese Routine viel Rechenleistung fordert..

    Vllt hat hier einer eine andere Idee..wie man sowas lösen kann.
    Die Fusebits sind auf jeden Fall korrekt.

    Gruss
    Patrick

  5. #5
    shedepe
    Gast
    Prinzipiell ist es so: Wenn du kein Problem damit hast, dass deine Hauptschleife manchmal langsamer läuft (womit man in der Regel bei der Verwendung von Interrupts oder zeitaufwendigen Unteroutinen rechnen muss), dann ist doch alles in Ordnung.

    Ohne deinen Code können wir dir aber auch nicht sagen ob man das effizienter gestalten kann.

  6. #6
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    47
    Beiträge
    68
    Hallo

    Ja..sagen wir so...es stört schon da ich gerne gewisse Abläufe schneller brauche da unterschiedliche CPUs miteinander arbeiten

    Meine Code ist folgender Massen

    i2c_start();
    i2c_write(adresse des mcp)
    i2c_write(0x14) // zb Port A
    i2c_write( data1 + data2+ data4 + data8+ data16 + data32 + data64 + data128 );
    i2c_stop();

    Das benötige ich jetzt so oft wie ich ports habe. jeder mcp23017 hat zwei ports, also pro ic 2x

    die variablen data werden mit der jeweiligen wertigkeit geschrieben zb 1 + 2 ergibt eine 3
    so kann ich jeden einzelnen Pin einfach ansprechen, und beinflusse je nach variable immer nur den entsprechenden pin des mcp

    problem hier ist, um so mehr ich diese routine verwende umso langsamer wird sie.
    frage ist nun ob man es vllt einfacher machen kann , da ich auch jede variable deklarieren muss

    Grüsse
    Patrick

  7. #7
    shedepe
    Gast
    Also I2C Frequenz hochsetzen: Das geht auch unabhängig vom Slave CPU Takt. (z.B. auf 400 kHz)
    Wie oft rufst du das auf? Und welche I2C library verwendest du?

    Und dann zeig mal etwas mehr Code. So sieht man ja echt nichts davon. Wird das in einem Interrupt aufgerufen? Welche Typen sind die Variablen? Also das was lang dauert ist vermutlich die Kommunikation. Da könnte es helfen eine Interrupt basierte Library zu verwenden.

  8. #8
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    47
    Beiträge
    68
    Hallo

    mehr code gibt es für die ausgabe nicht.
    die routinen laufen permantent im programm mit.
    Es gibt eine eigangsroutine und eine ausgangsroutine.
    die probleme fangen erst an wenn die ausgangsroutinen wie oben gezeigt ins programm eingefügt werden..ca wenn ich das ganze 9 oder 10 mal aufrufe.

    die Variablen sind immer data mit der entsprechenden wertigkeit
    zb

    taste 1
    data1 = 1

    taste 2
    data2 = 2

    taste 3
    data4 = 4

    wenn man das jetzt addiert ensteht die bitkombination

    1 + 2 + 4 + 0 + 0+ 0 + 0 +0 = was dann irgendwann 0- 255 entspricht um den mcp port anzussprechen
    vllt kann man das auch mit einer routine anders machen

    die lib ist die i2c.h von codevision

    Grüsse
    Patrick

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Hast du schon versucht das Ergebnis vorher zusammenzusetzten und dieses dann gesamt an die Funktion zu übergeben?
    Also in etwa so :
    Code:
    unsigned char ergebnis = data1 + data2 + ... + data8
    I2c_start
    ...
    ...
    ...
    i2c_write(ergebnis)
    I2c_stop
    Was du auch testen kannst wäre einen fixen wert zu übergeben (und schauen ob sich etwas verbessert)

    Ein weiterer test wäre nicht mit addition sondern mit schieben (ergebnis = (data1<<0) | (data1<<1) | ... | (data8<<7) ).
    In dataX steht dann eine 0 oder 1 je nachdem ob der Eingang low oder high ist.

    MfG Hannes

  10. #10
    shedepe
    Gast
    Kann die Library denn überhaupt den Hardware I2C des Atmegas nutzen. Wenn ich danach google, dann sieht das stark danach aus als ob die lib Software I2C auf jedem beliebigen Pin machen kann. Da muss man sich natürlich nicht wundern wenn das entsprechend langsam ist.

    Als alternative kann ich die lib von Peter Fleury empfehlen: http://homepage.hispeed.ch/peterfleu...-software.html
    Geht dann natürlich nur auf den Hardware I2C Pins.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. ATMEGA16 nicht mehr erreichbar. Fusebits falsch gesetzt?
    Von ricola im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 25.12.2013, 19:46
  2. Zweiter Mikrocontroller als Taktgeber - Fusebits falsch gestellt -.-
    Von Lif im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 4
    Letzter Beitrag: 10.12.2012, 21:04
  3. [ERLEDIGT] Stopwatch wird ignoriert/ falsch interpretiert
    Von Mac80 im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 09.05.2012, 14:31
  4. Fusebits werden falsch ausgelesen u. lassen sich nich ändern
    Von memi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 10.05.2006, 16:27
  5. Mega32 Fusebits falsch gesetzt
    Von klucky im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 28.01.2006, 23:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test