- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: Interrupt-Programmierung nötig. Aber wie??? AVR-Studio 8bit

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.12.2009
    Beiträge
    18

    Interrupt-Programmierung nötig. Aber wie??? AVR-Studio 8bit

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Mein Problem ist recht schnell erklärt:

    Mein Asuro soll bei Betätigung eines der Pollswitches in einen INterrupt springen. Aber über Interrupts weiß ich gar nichts. Welche Befehle brauche ich? Bibliothek? Es ist der Standart 8Bit Prozessor, über AVR-Studio programmiert. Forensuche, Google und der KAuf des "Mehr Spaß mit Asuro Band 2" half auch nicht.

    Benötigt vin mir wird:

    Welche Bibliothek, welche Befehle. Perfekt wäre ein klitze-kleines Beispiel Programm, denn es hat sich herausgestellt, dass ich dadurch am schnellsten lerne.

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.679

    Re: Interrupt-Programmierung nötig. Aber wie??? AVR-Studio 8

    Zitat Zitat von Zehplusplus
    ... Benötigt vin mir wird: ...
    Das ist eine von diesen hübschen Aussagen, die einem richtig viel Lust am Helfen macht.

    Zitat Zitat von Zehplusplus
    ... bei Betätigung eines der Pollswitches in einen INterrupt springen ...
    Pollswitch ist eine Funktion, sie pollt eine switch-Stellung; sprich: man muss aktiv werden, um das Ergebnis zu erhalten. Das ist ziemlich genau das Gegenteil eines Interrupts. Also musst Du etwas basteln . . . .
    Zitat Zitat von Zehplusplus
    ... INterrupt ... Forensuche, Google und der KAuf des "Mehr Spaß mit Asuro Band 2" half auch nicht ...
    http://www.rn-wissen.de/index.php/C-...Programmierung
    http://www.mikrocontroller.net/artic...mit_Interrupts
    http://www.mikrocontroller.net/artic...errupt-Quellen

    Ach ja, das (klick hier) hast Du offensichtlich auch noch nicht gelesen.
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2009
    Ort
    NRW
    Beiträge
    562
    Hallo

    oberallgeier ich versteh nicht warum du immer wenn du jemandem "hilfst" diesen vorab kritisieren musst. Wenn du keine Lust am Helfen
    hast dann lass es doch ganz einfach und vergraul hier nicht Leute die auf der Suche nach freundlicher und vernünftiger Beratung sind.

    Gruß Thund3r

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    AVR Studio kann ohne zusätzliche Software eigentlich nur Assembler.

    Dazu musst Du zuerst eine Interrupt Vektortabelle ganz am Anfang des Flash legen. Danach muß der Stack initialisiert werden.
    Code:
    .cseg
    .org 0
    ;*** Interrupt vectors ***
    rjmp	reset		;Reset Handler
    rjmp	pwm			;INT0 Handler
    reti				;Pin Change
    rjmp	TIM0_OFV0	;Timer 0 Overflow Handler
    reti				;EE_RDY
    reti				;Analog Comperator
    ;*** Initialisation ***
    reset:
    ;	LDI temp,low(ramend) ;not possible at ATtiny 12, possible at AT90LS2323
    ;	OUT SPL,temp
    ;        LDI temp,high(ramend) ,nur bei Controllern mit höheren RAM Adressen als 0xFF!
    ;        OUT SPH,temp
    .....
    
    .....
    ;*** Initial Timer 0 ***
    	LDI temp,0b00000001		;Clock divider CK/1
    	OUT TCCR0,temp
    	LDI temp,0b00000010		;CK Interrupt enable
    	OUT TIMSK,temp
    .....
    
    .....
    ;*** Interupts freigeben
    SEI
    Hier mal ein Beispiel für den ATtiny12.

    Die eigentliche Interruptroutine wird dann beim eintreffen des Interrupts aufgerufen, sofern die entsprechenden zugehörigen Register richtig gesetzt und der globale Interrupt mit "SEI" freigegeben wurden.

    Code:
    ;*** Timer 0 Overflow ***
    TIM0_OFV0:
    PUSH temp ;Alle benutzten Register retten - Geht bei Tiny 12 zwar etwas anders, aber nur mal als Beispiel!
    IN temp,SREG
    PUSH temp
    PUSH temp1; usw.
    Dein Code.....
    
    
    POP temp1; Benutzte Register wieder vom Stack holen
    POP temp
    OUT SREG,temp
    POP temp
    RETI   ; Ende der Interrupt Routine

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    17.12.2009
    Beiträge
    18
    @oberallgeiier, die beiden links hab ich schon gecheckt, aber nicht verstanden. auch wenn ich Thund3r recht geben muss, danke ich dir trotzdem.

    @wkrug, also muss ich die Interrupts im Assembler erstellen? Das wird hart, da hab ich das letzte Mal in der Lehre mit gearbeitet.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von M1.R
    Registriert seit
    02.06.2007
    Ort
    Freiburg
    Beiträge
    213

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Mein Asuro soll bei Betätigung eines der Pollswitches in einen INterrupt springen.
    Auch das wurde bei der Entwicklung des asuro wohl schon vorgesehen und ist schon lange Bestandteil der Library. Die Erweiterung wurde von einem mir unbekannten "Robotrixer Buxtehude" eingeführt.

    In der Schaltung ist es so umgesetzt: Der eigentliche analoge Tasteneingang PC4 ist ein Eingang ohne PullUp, am Interrupteingang INT1 (PD3) liegt über R23 (1M) und R24 (1k) ein High an PD3. Der Kondensator C7 dient zur Entprellung. Bei einem Tastendruck wird der entsprechende Tastenwiderstand zwischen R23 und GND geschaltet, bei K6 wäre das R30 mit 68k. Die Spannung an PD3 über R24 wäre dann x/5V=68k/1068k=0,32V, also eindeutig ein Low. Bei den anderen oder mehreren Tasten ist der entsprechende Tastenwiderstand kleiner als 68k, die Spannung an PD3 dann noch kleiner.

    Die zusätzliche Software besteht aus drei Funktionen:
    StartSwitch() - PD3 auf Eingang, INT1 bei fallender Flanke
    StopSwitch() - INT1 ausschalten
    SIGNAL (SIG_INTERRUPT1) - Die ISR setzt ein Flag (alter Interruptname!)

    Code:
    SIGNAL (SIG_INTERRUPT1)
    {
    switched=1;
    StopSwitch();
    }
    
    /* for working with Interrupt */
    void StartSwitch(void)
    {
    	SWITCH_OFF;
    	DDRD &= ~SWITCHES;					// Switches as Input => ext. Int 1
    	MCUCR &= ~((1 << ISC11) | (1 << ISC10));// Low level generates interrupt
    	GICR |= (1 << INT1);					// Enable external Interrupt 1 
    }
    
    void StopSwitch(void)
    {
    	GICR &= ~(1 << INT1);
    }
    
    Definitionen in asuro.h:
    
    int switched;
    
    #define SWITCHES   (1 << PD3)
    #define SWITCH_ON  PORTD |= SWITCHES
    #define SWITCH_OFF PORTD &= ~SWITCHES
    Das ist seit ca. Version 2.3 in der Lib, vermutlich hat auch die aktuelle Lib (die ich bekannterweise nicht verwende) eine entsprechende Funktion. Alle Libs kann man hier downloaden:
    http://sourceforge.net/projects/asuro/files/

    btw muss man das nicht verstehen:
    SWITCH_OFF;
    DDRD &= ~SWITCHES; // Switches as Input => ext. Int 1

    Gruß

    mic

    [Edit]
    Mal wieder zu langsam gewesen. Sternthaler erklärt das viel besser ;)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    @wkrug: Zehplusplus hat den Asuro, daher wird er auch den avr-gcc installiert haben und mit C arbeiten....

    @Zehplusplus: Nein, Du musst kein Assembler verwenden.
    Die Taster des Asuro kannst Du über den Interupt INT1 auswerten. Damit erfährst Du allerdings nur, dass einer der Taster betätigt wurde. Welcher genau, musst Du immer noch über PollSwitch() auswerten.

    Hier mal ein Beispielcode:
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    int main (void)
    {
    	MCUCR |= (1<<ISC11);	//Interrupt wird bei fallender Flanke generiert
    	GICR  |= (1<<INT1);		//Interrupt INT1 aktivieren
    	sei();					//Interrupts global aktivieren
    
    	while(1)
    	{
    		//Hauptschleife
    	}
    	
    	return 0;
    }
    
    //Interruptroutine
    ISR(INT1_vect)
    {
    	//Hier kommt die Interruptroutine rein
    }
    Hoffe, das hilft schon mal ein bißchen.

    Gruß,
    askazo

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    06.11.2006
    Beiträge
    1.078
    Hallo
    oberallgeier ich versteh nicht warum du immer wenn du jemandem "hilfst" diesen vorab kritisieren musst. Wenn du keine Lust am Helfen
    Wenn nicht kritisiert wird, wird auch kein Fehler erkannt, ergo kein Fehler korrigiert.

    Außerdem hören sich für mich diese Art von Anfragen nicht nach Bitte um Hilfe, sondern eher nach "gibt es hier einen Dummen, der mir die Arbeit macht" an.
    Das mag in diesem konkreten Fall nicht so sein, der Eindruck drängt sich aber auf.

    Mit freundlichen Grüßen
    Benno
    Wo man nicht mit Vernunft handelt, da ist auch Eifer nichts nütze; und wer hastig läuft, der tritt fehl.
    Ein König richtet das Land auf durchs Recht; wer aber viel Steuern erhebt, richtet es zugrunde

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Zehplusplus hat den Asuro, daher wird er auch den avr-gcc installiert haben und mit C arbeiten....
    Drum hab ich ja geschrieben, "Wenn keine weitere Software installiert ist".
    Wenn AVR-GCC schon installiert ist gehts natürlich in "C":

Berechtigungen

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

Labornetzteil AliExpress