- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 7 von 7

Thema: Atmega168A Prescaler ändern und neu flashen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Atmega168A Prescaler ändern und neu flashen

    Hey Leute,

    ich bin noch relativ neu bei den Microcontrollern. Nun habe ich ein Beispielprojekt aus einem Buch (make: AVR programming)
    probieren wollen aber das führt zu Problemen. Vorweg, ich nutze einen Atmega168A und als Oberfläche nutze ich Atmel Studio 7, als Kommandozeilentool AVRdude, als
    ISP Programmer einen chinesischen USBasp.
    In dem Beispiel im Buch wird der Prescaler von den standartmäßigen 1 MHz auf die volle Power gesetzt (8 MHz).

    Das passiert über

    #include <avr/power.h>
    clock_prescale_set(clock_div_1);

    nun ist die einmalige Ausführung des Programms anscheinend kein Problem. Sobald ich jedoch etwas neues flashen will, ist es nicht mehr möglich und ich bekomme

    avrdude.exe: Device signature = 0x000102
    avrdude.exe: Expected signature for ATMEGA168 is 1E 94 06
    Double check chip, or use -F to override this check

    Dies passiert, sobald ich den Chip schneller als 1 MHz takte möchte. Wenn ich den Chip langsamer takten möchte, sprich einen clock_div > 8 nutze, ist ein weiteres flashen
    des Chips anscheinend Glückssache. Mal klappt es und mal nicht.

    Kann es sein, dass die CPU des Chips irgendwie mit dem ISP-Programmer oder so abgestimmt sein muss, damit man flashen kann? Und wie löse ich dieses Problem?

    Vielen Dank schonmal,
    Mike

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Hallo Mike,
    willkommen im Forum.

    .. Wenn ich den Chip langsamer takten möchte, sprich einen clock_div > 8 nutze ..
    Der Controller läuft nur mit CKDIV8 auf [Ein] oder [AUS], sprich Fuse CKDIV8 ist gesetzt oder gelöscht. Egal ob Du es programmtechnisch machst oder direkt über das Setzen der Fuses - anders geht es nicht mit dem CKDIV8. Du kannst aber verschiedene Prescaler am Chip setzen, die - z.B. für Timer - den Controllertakt für diese Chipsektion niedriger setzen.

    Näheres siehe hier unter Fusebits - aber besser fährst Du natürlich wenn Du Dir die Dokumentation zum m168 ansiehst - dort z.B. unter 13. System Clock and Clock Options. NUR als ERGÄNZUNG dazu kannst Du natürlich auch mal diesen ABschnitt durcharbeiten.

    WENN Du den Chip schneller takten möchtest musst Du beim flashen darauf, dass der Takt beim Flashen (keine Ahnung wie das beim AVRdude gemacht wird) immer kleiner als 1/4 des Taktes ist, mit dem >aktuell< der Controller getaktet wird.
    Ciao sagt der JoeamBerg

  3. #3
    Note that any value can be written to the CLKPS bits regardless of the CKDIV8 Fuse setting.

    Das steht unter anderem im Datenblatt zum Clock Pescale Register. Ich hatte das nun so gedeutet, dass ich den Prescaler ändern kann, ohne die Fuse löschen zu müssen.
    Demnach müsste der Code mit dem von mir verwendeten Macro zum prescalen soweit erstmal ausreichen oder nicht? Habe noch nicht ganz verstanden, wozu genau ich die Fuse brauche,
    außer ich wollte den Prescaler permanent auf 8 MHz setzen.

    WENN Du den Chip schneller takten möchtest musst Du beim flashen darauf, dass der Takt beim Flashen (keine Ahnung wie das beim AVRdude gemacht wird) immer kleiner als 1/4 des Taktes ist, mit dem >aktuell< der Controller getaktet wird.
    Verstehe ich auch nicht so ganz. Meinst du, wenn ich den Chip langsamer getaktet habe als 1 MHz, dann muss ich beim nächsten flashen den "flashtakt" irgendwie runtersetzen? Das werde ich mal probieren,
    könnte die Hälfte meiner Prescaler Probleme beheben, aber nicht erklären, woran es nach dem Setzen des Taktes auf 8 MHz hapert.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Note that any value can be written to the CLKPS bits regardless of the CKDIV8 Fuse setting ..
    GENAU. Aber der prescaler beeinflusst NICHT den Controllertakt - der tickert im fabrikneuen Zustand mit 8 MHz >>aus dem internen Oszillator<< ABER (wieder fabrikneu) ist Fuse CKDIV8 gesetzt, sodass der resultierende CONTOLLERTAKT - egal ob interner Takt oder externer Oszillator/Quarz-oderwasauchimmer - durch acht dividiert wird, fabrikneu daher 1 MHz. Der Prescaler ..:
    This can be used with all clock source options, and it will affect the clock
    frequency of the CPU and all synchronous peripherals. clkI/O, clkADC, clkCPU, and clkFLASH are
    divided by a factor ..

    d.h. damit wird NICHT der Prozessortakt reduziert. Damit werden aber die entsprechenden Takteingänge von Timer, ADC etc an die gewünschten Gegebenheiten angepasst (keine Ahnung ob das jetzt verständlich ist - ich hatte seinerzeit ewig gebraucht das zu begreifen).

    .. wenn ich den Chip langsamer getaktet habe als 1 MHz, dann muss ich beim nächsten flashen den "flashtakt" irgendwie runtersetzen? ..
    Genau. Bei 1 MHz (also fabrikneu - oder so eingestellt) muss der Flashtakt kleiner als 250 kHz sein.

    Nachtrag:
    Unwissen bringt Fehler. Leider kenne ich die Dokumentation zum mega168 (auch zum mega238 und m1284) nicht auswendig, nicht mal den Abschnitt "System Clock Prescaler" bei den von mir schon länger benutzten Typen :-/ . Darin verstehe ich seit eben wirklich so, dass damit offenbar wirklich der >>Prozessortakt<< direkt beeinflusst werden kann. Das wusste ich bisher nicht. Also ist es wohl möglich die von Dir gewünschte Prozessortaktung mit dem CLKPR zu beeinflussen. Das wurde von mir bisher nie benutzt, daher kann ich damit nicht umgehen. sorry.
    Geändert von oberallgeier (28.10.2016 um 11:40 Uhr) Grund: Nichtwissen zu CLKPR meinerseits
    Ciao sagt der JoeamBerg

  5. #5
    Habe nun mal auf clock_div_32 gestellt. Das war wohl ein Fehler. Kriege nun die Meldung

    Code:
    avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude.exe: error: program enable: target doesn't answer. 1 
    avrdude.exe: initialization failed, rc=-1
                 Double check connections and try again, or use -F to override
                 this check.
    Sobald ich versuche, über die Commandline mit -B250 die Taktrate des USBasp runterzusetzen, kommt

    Code:
    avrdude.exe: set SCK frequency to 4000 Hz
    avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude.exe: error: program enable: target doesn't answer. 1 
    avrdude.exe: initialization failed, rc=-1
                 Double check connections and try again, or use -F to override
                 this check.
    nichts mehr zu machen

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Zitat Zitat von wedemännchen Beitrag anzeigen
    Habe nun mal auf clock_div_32 gestellt. Das war wohl ein Fehler. Kriege nun die Meldung .. nichts mehr zu machen ..
    Hast Du mal nachgerechnet? WENN Dein Controller (fabrikfrisch) mit 1 MHz tickt und Du den Prescaler auf clk/32 stellt, dann kommen nach Adam Riese 31,25 kHz raus. Mit meinem Flashgerätchen kann ich zwar bis runter zu 1.21 kHz "programmieren", wenn ich mich richtig erinnere, aber unter 5 kHz oder so nur Fuses umstellen. Flashen geht bei meinem Dingelchen, wenn ich mich richtig erinnere, erst so ab 50 kHz aufwärts. Leider kann ich Dir zu avrdude und Deinem chinesischen USBasp nix raten, da ich über das Protokoll STK500 flashe.

    Zitat Zitat von wedemännchen Beitrag anzeigen
    .. könnte .. nicht erklären, woran es nach dem Setzen des Taktes auf 8 MHz hapert.
    Nur mal so, als Sicherheitsabfrage, hast Du den Controller weiter auf dem internen Takt stehen? Bei Dir sollten die Fuses in diesem Fall z.B. auf /SUT_CKSEL auf Int. RC Osc. 8 MHz; Start-up time ../ oder so ähnlich stehen, also auf INT.ernem RC OSC.illator! Ganz sicher also NICHT auf z.B. /Ext. Crystal Osc. ../ oder ähnlich, da ich vermute, dass Du an Deinem Controller keinen externen Quarz angeschlossen hast (hab ich Recht?).

    Zitat Zitat von wedemännchen Beitrag anzeigen
    .. Atmega168A und als Oberfläche nutze ich Atmel Studio 7, ..
    Kannst Du denn damit irgendwie die Fuses in Deinem Controller auslesen?
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. ATmega168A: Software PWM Periodendauer verändert sich, woran kann das liegen?
    Von Dracyria im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 28.09.2015, 10:03
  2. Problem mit ATMega168A und PWM
    Von TechMo im Forum Assembler-Programmierung
    Antworten: 6
    Letzter Beitrag: 19.09.2012, 08:10
  3. Verständnisfrage: Prescaler
    Von Icon2k im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 25.12.2010, 18:17
  4. AVR Prescaler Berechnung?
    Von weijr im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 24.11.2006, 12:38
  5. Prescaler ADC
    Von Gento im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 03.09.2006, 22:19

Stichworte

Berechtigungen

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

Labornetzteil AliExpress