- Labornetzteil AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Problem mit Interrupt

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2006
    Beiträge
    21
    Anzeige

    Praxistest und DIY Projekte
    Ich denke es liegt daran dass das SREG - Register bei einem Interrupt verändert wird.
    Kann das ein Grund dafür sein? Und kann man das irgendwie verhindern?

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    478
    Hi Stefan,

    guck mal ein paar Posts weiter oben, da hab ich was zu dem Statusregister hinterlassen.

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2006
    Beiträge
    21
    Oh, das ist mir jetzt aber peinlich. Das hab ich ganz übersehen, Sorry!!

    Nein hab keine Ahnung was ich da überhaupt mache! Wir haben das mal theoretisch in der Schule gelernt, praktisch jedoch nie viel gemacht.

    Werds mir gleich mal anschauen!!

    Danke nochmals, war echt keine absicht!

    mfg

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2006
    Beiträge
    21
    ES FUNTKIONIERT!!

    Vielen Dank!

    Sorry das ich so auf der Leitung stand.

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    478
    Hi Stefan,

    ich hab da noch ne Frage zu deinem Code, was passiert hier

    Code:
    ;in tmp2, pina
       ;ldi tmp, 0b01001101  ;Akku erkennung ab 3V
       ;cp tmp2, tmp
       ;brlo entladen_aus
    und das
    Code:
    ;Warte auf Stop-Taste
       in tmp2, pind         ;Liest Eingangsport ab
       andi tmp2, 0b00000001  ;Nur das Start-tasten-Bit einlesen
       ldi tmp, 0b00000001
       cp tmp2,tmp
       breq entladen_stop            ;Ist Bit gesetzt, Spring in die Start- Fkt.
    ich nehme an, du schaltest mit dem Taster einen Pullup an den PIN?

    kannst du schneller mit sbic = skip if bit in I/O is cleared machen. Skip´s überspringen immer nur den nächsten Befehl und man muss immer etwas auf die Logki aufpassen.
    Dafür würdest du den Programteil "entladen_stop" mit einem rcall entladen_stop und "ret" in eine Subroutine setzten.

    mfg,
    The Man

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2006
    Beiträge
    21
    Hallo!
    Find ich prima das sich da noch wer den Kopf zerbricht. Bin immer dankbar für neue Tipps und Tricks.

    Im ersten Programmteil den du gepostet hast wird kontorlliert ob überhaupt noch ein Akku an der Schaltung angeschloßen ist. Ich möchte das wenn der Akku abgeschloßen wird, das Programm zurück ins Hauptmenü springt damit dann am Display das noch folgen soll wieder da steht "Bitte Akku anschließen".
    Der Schaltungsaufbau sieht dabei wie folgt aus:
    Die halbe Akkuspg wird über einen ADW mit einer Referenzspg von 5V umgewandelt. Daher ergeben sich für 5V am Akku der Binärcode 10000000 nach dem ADW, und bei 3V am Akku der Binärwert 01001101.

    Hab den Teil der kontorlliert ob der Akku noch dran hängt übrigens inzwischen in die Funktion "Automatik" verschoben.
    So wird die Abfrage erst gemacht wenn die Akkuspannung unter den eingestellten Vergleichswert gefallen ist, was ja logischerweiße auch passiert wenn der Akku abgeschloßen wird. Hab da aber gerade einen Fehler entdeckt und muss da nochmal ran.
    Der Vergleichswert bei der von mir geposteten Version ist ja noch mit 5V fest eingestellt, kann man aber mittlerweile mit einem Taster auswählen ob man den Entladevorgang bei 4, 5 oder 6V beenden möchte. Angezeigt wird die Ausgewählte Vergleichsspannung mittels 2 LED's.



    Zum zweiten Programmteil. Also das es nur einen Ein/Aus-Taster gibt ist eh schon bekannt. Am Pin hängt ein Wiederstand (ca. 10k) gegen Masse. Wird der Taster gedrückt, verbindet man dann die +5V mit dem Pin.
    Also wenn die Akkuspannung unter die Vergleichsspannung fällt soll von der Schaltung nach einer bestimmten Zeit nochmals weiter entladen werden.
    Wird aber die Stop-Taste gedrückt soll die Schaltung komplett mit dem Entladen aufhören und wieder in das Hauptmenü zurück springen und dort bleiben bis wieder die Start-Taste gedrückt wird.

    Deinen Befehl durchschau ich noch nicht so ganz, werd mich aber mal mit den Skip- Befehlen befassen.
    Ich hab mir ganz am Anfang als ich mit dem Programm begonnen hab überlegt nehm ich Branch oder Skip, hab mich dann für Branch-Befehle entschieden da mir vorgekommen ist dass, damit das Programm übersichtlicher bleibt.

    Danke
    mfg Stefan

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    478

    ADC

    Hi,

    was ich vervollständigend sagen wollte, es ist gut sich Gedanklich über den Zusammenhang von branch, skip und rjmp Befehlen klar zu werden.
    Dabei ist eines nicht offensichtlich: eine Abfolge von skip und dann rjmp ist im Prinzip das selbe wie der Einsatz eine branches. Nur wenn man nicht 100% sicher ist, welche werte im Register sind, muss man erstmal maskieren (hast du ja auch gemacht) und dieses maskieren ist mit skip unnötig, da man immer nur das eine Bit testet.

    Das du in dem einen Teil eine ADC vor hast dachte ich mir schon fast, wollte mal sehen, was du schreibst. Um ADC´s zu machen muss man die interne Hardware nehemen und eben initialisieren, also entsprechende Steuerbits setzten, die die Funkrion steueren. Zusätzlich muss man auf Statusbits achten, die einem sagen, ob eine Conversion fertig ist. An manchen Stellen ist da Vorsicht geboten, weil manche Bits dadurch gelöscht werden, dass sie per Software gesetzt werden. Is ja auch logisch ne^^? Steht dann im Datenblatt.
    Womit wir auch schon beim Thema sind. Das Ding erschlägt einen zwar mit ca.300 Seiten erstmal, aber dann sieht man, dass man immer nur die Seiten braucht, die sich mit der Hardware befassen, die man nutzten will - Puh, nochmal Schwein gehabt! Da wir Assembler machen ist das Datenblatt in sofern gut, als dass man HAARGENAU das macht was da steht und die Kiste läuft. Das nennt man dann Maschienennah.

    Was die ADC´s angeht gibt es hier https://www.roboternetz.de/wissen/in.../ADC_%28Avr%29
    einen ersten Blick darauf. Ich würde aber auf jeden noch das Datenblatt lesen. Das macht man am besten mit ner Tasse Kaffe - willkommen in der Welt der Bastler (nicht weils ewig dauert, sondern weils dazu gehört...)

    Wenn´s garnicht gehen will, such ich bei mal nen entsprechenden Code.

    Was ich am Anfang auch gemacht, habe war, an einen ADC Kanal einen Poti anschließen, an einen PORT der das ermöglicht 8 LEDS, und zusehen, dass man das ADC Ergebnis mal ausgibt, dann sieht man gleich, ob´s klappt. Und wenn man will kann man auch jedes andere Register sehen - sehr hilfreich! Außerdem sind LED´s immer hilfreich, um sie zum Fehlersuchen zu nehmen. Mann kann sie im Prog an bestimmten Stellen setzten lassen, um zu sehen, ob es da überhaupt ankommt. Mach ich bis jetzt immer so.

    Greez.

  8. #18
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Hallo Stefan_84,

    weiss nicht ob Dir mein C-Code hilft, aber die Initialisierung (m)eines mega168 und (D)eines mega8515 ist IM PRINZIP sicher ähnlich und der Code ist doch etwas Assemblernah . . . Mit der folgenden Routine initialisiere ich den ADC und lese ihn in der ISR aus. Übrigens repräsentiert der Wert "ADC" in meiner ISR zum Auslesen des ADC die Befehle zum Auslesen des Low- und danach des High-Bytes. Dabei ist die Reihenfolge des Auslesens wichtig! Das steht auch im doc. Vielleicht ist das Beispiel eine Hilfe für Dich?

    Code:
    /* >> 
      Auszug aus   ...C1..\m168D_10\m168D_iir_10x35.h
     ===================================================================================
     ================================================================================ */
    
    // .........................
    
    /* =================================================================================
       ##### Hier ISR und ISR - Initialisierung(en)
    ================================================================================= */
    /* ============================================================================== */
    
    // Auszug aus *com*.h
    volatile uint16_t adc3_dat;     // ADC-Wandlung des Sharp GP2D120: adc3_dat=ADC;
    
    // .........................
    
    /* ============================================================================== */
    /* ===  Initialisierung fuer ADC    mega168   MIT Interrupt ========================
    // ISR(ADC_vect) vgl. iomx8.h   // Interrupt- Vektor 21
       ADC3/PC3 auf 10 Bit, Wandlung #####>>>>> Interrupt ausgelöst                   */
    void ADC3_10_init_irupt(void)			//
    {	
        ADMUX  |= (1<<MUX1)|(1<<MUX0);	// Wandlung mit ADC3 
        ADMUX  |= (1<<REFS0);               // Referenzspannung ist Vcc doc S 256 und
    	// https://www.roboternetz.de/phpBB2/ze...=287602#287602
        ADCSRA |= (1<<ADPS2)|(1<<ADPS0);    // ADC Prescaler = clock/32          S258
                            // ... das ergibt aus der 4,88-kHz-Motor-PWM 152,5 Hz
        ADCSRB |= (1<<ADTS1)|(1<<ADTS0);    // ADATE Trigger=TC0-cmpmatchA S259
        ADCSRA |= (1<<ADATE);               // Auto Triggering Enable, doc S 247 (257)
        ADCSRA |= (1<<ADIE);                // ADC Interrupt Enable, doc S 258
        ADCSRA |= (1<<ADEN);		// AD Enable
        ADCSRA |= (1<<ADSC);	        // starte gleich die erste Wandlung
    }
    /* ============================================================================== */
    /* ===  Initialisierung fuer ADC    mega168    OHNE Interrupt  =====================
    // 26mai2008 Diesen Code übernommen aus 22dzms168-regel-x13.c
    // ISR(ADC_vect) vgl. iomx8.h   // Interrupt- Vektor 21 , KEIN Interrupt enabled
       ADC3/PC3 auf 8 Bit, Wandlung "auf Abruf",  es wird kein Interrupt ausgelöst    */
    /* #################  ADC3_10_init  ausgeblendet Anfang
    void ADC3_10_init(void)			//
    {	
    //    ADMUX  |= (1<<ADLAR);		// 8bit-left-adjusted  (doc S256)
        ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);    // ADC Prescaler clock/128 S258
        ADMUX  |= (1<<MUX1)|(1<<MUX0);	// Wandlung mit ADC3 
        ADCSRA |= (1<<ADEN);		// AD Enable
        ADCSRA |= (1<<ADSC);	        // starte erste Wandlung
    } ############  ADC3_10_init  ausgeblendet Ende */
    /* ============================================================================== */
    
    
    /* ============================================================================== */
    /* ====  Initialisierungsroutinen sind zu Ende - es folgen die ISR=============== */
    /* ============================================================================== */
    
    // ..........................................
    
    /* ============================================================================== */
    /* ===  Nicht unterbrechbare ISR für ADC3 auf Pin 26/PC3/mega168  =============== */
    /* Routine übernimmt ADC-Wert.               */
    ISR(ADC_vect)                   // _VECTOR(21)   
    {               
            adc3_dat  = ADC;        // Hole Wert
            ADCSRA   |= (1<<ADSC);  // starte nächste Wandlung
    }      
    /* ============================================================================== */
    
    
    /* ============================================================================== */
    /* ============================================================================== */
    Viel Erfolg
    Ciao sagt der JoeamBerg

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2006
    Beiträge
    21
    Hallo!
    Der 8515 hat doch gar keinen intergrierten ADW, hab dafür ein ADC0804 verwendet. Daher lies ich einfach die Werte die an einem Port anleigen ein und rechne um was das dann für eine Spannung ist.

    Mit dem ADW hab ich mich bei einem Bastelprojekt von vor ein paar Monaten beschäftigt. Da wollte ich die Akkuspg. während eines Entladevorganges in den PC einlesen und eine Kennlinie machen. Hab das mit dem Poti damals auch gemacht. Jetzt ist halt statt der Parallelen Schnittstelle des PC's der Portc des 8515 angeschloßen.
    Das aktuelle Projekt ist somit also eine weiterführung des ersten Projektes. Das Entladegerät soll ebenfalls dann eine Schnittstelle zum PC hin bekommen, jedoch kann es auch ohne PC verwendet werden und als normales Entladegerät arbeiten.

    Das man die Datenblätter benötigt um etwas zu machen hab ich schon gelernt. Hab vor mir am Schreibtisch ne dicke Mappe liegen, voll mit Datenblättern, Anleitungen und Schlatungsbeispielen die ich im laufe der Zeit mal irgendwo gefunden habe.

    Hab das Entladegerät auch schon am Steckbrett aufgebaut und es funktioniert auch schon so halbwegs.

    mfg
    Stefan

  10. #20
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Zitat Zitat von Stefan_84
    ... Der 8515 hat doch gar keinen intergrierten ADW ...
    Uuuups - ich bin beim Nachgucken/Lesen in die Zeile darunter geraten, die ist für den 8535.
    Ciao sagt der JoeamBerg

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress