Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt-Programmierung nötig. Aber wie??? AVR-Studio 8bit
Zehplusplus
30.03.2010, 22:41
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.
oberallgeier
30.03.2010, 23:34
... Benötigt vin mir wird: ...Das ist eine von diesen hübschen Aussagen, die einem richtig viel Lust am Helfen macht.
... 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 . . . .
... INterrupt ... Forensuche, Google und der KAuf des "Mehr Spaß mit Asuro Band 2" half auch nicht ... http://www.rn-wissen.de/index.php/C-Tutorial/Interrupt-Programmierung
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Interrupt-Quellen
Ach ja, das (klick hier) (http://www.arexx.com/downloads/asuro/asuro_manual_de.pdf) hast Du offensichtlich auch noch nicht gelesen.
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
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.
.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.
;*** 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
Zehplusplus
31.03.2010, 07:13
@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.
guck mal da:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=341368#341368
Gruss
M.
radbruch
31.03.2010, 09:33
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!)
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 ;)
@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:
#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
Yossarian
31.03.2010, 09:52
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
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":
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.