Question:
Problème avec la minuterie 0
Ashlyn Black
2015-12-02 22:30:08 UTC
view on stackexchange narkive permalink

Je fais mes premiers pas bancaux en dehors de l'IDE Arduino et je n'ai pas beaucoup de succès avec les minuteries / interruptions. Je peux définir une broche pour émettre et allumer une LED avec des registres bien, mais je ne peux pas pour toute ma vie la faire clignoter à l'aide d'une minuterie. J'ai essayé de nombreux tutoriels et suivi de très près la fiche technique Atmel ATmega328.

Utilisation d'un Arduino Uno R3 & Atmel ICE (ISP.) Mon système de développement est Raspbian (Debian) avec la chaîne d'outils GNU AVR (avr-gcc , avr-objcopy, avrdude.) En plus de ne pas avoir de chargeur de démarrage, c'est une carte standard (y compris les fusibles).

Voici mon code actuel:

  #include <avr / io.h> # include <avr / interrupt.h>ISR (TIMER0_COMPA_vect) {PORTB ^ = (1 << PB5); // Basculer la broche Arduino # 13} int main (void) {DDRB = (1 << DDB5); // La broche Arduino # 13 est Output cli (); // Effacer les interruptions OCR0A = (caractère non signé) 0xFF; // Comparer le registre A = 255 TIMSK0 = (1 << OCIE0A); // Activer l'interruption pour Comp. Reg. A TCCR0A = (1 << WGM01); // Mode CTC sei (); // Définir les interruptions TCCR0B = (1 << CS02) | (1 << CS00); // Diviser par 1024 Prescaler (GO!) Return 0;}  

Je ne sais pas si je ne vois pas quelque chose ou si j'ai mis les registres dans le mauvais ordre mais ça me rend fou.

«return 0» ne réinitialise-t-il pas l'appareil? Essayez `while (1);` pour le faire attendre indéfiniment.
Je vais crier. Merci! (Faites-vous la chose Répondre à la question ou dois-je?)
Le commentateur doit le convertir en réponse.
Deux réponses:
Gerben
2015-12-03 01:18:56 UTC
view on stackexchange narkive permalink

return 0 réinitialise l'appareil. Utilisez plutôt while (1); pour le faire attendre indéfiniment.

Juste pour clarifier, faire un retour depuis `main` ne réinitialise ** pas ** l'appareil, comme je l'ai montré dans ma réponse. Je le mentionne au cas où les gens liraient cette réponse et penseraient que revenir de «main» est un moyen facile de réinitialiser l'appareil.
Nick Gammon
2015-12-09 05:36:51 UTC
view on stackexchange narkive permalink

Revenir depuis main ne réinitialise pas l'appareil (il redémarrerait et recommencerait dans ce cas). Il appelle exit qui désactive les interruptions et effectue une boucle indéfiniment.

  00000068 <__ctors_end>: 68: 11 24 eor r1, r1 6a: 1f be out 0x3f, r1; 63 6c: cf ef ldi r28, 0xFF; 255 6e: d8 e0 ldi r29, 0x08; 8 70: de bf out 0x3e, r29; 62 72: cd bf sortie 0x3d, r28; 61 74: 0e 94 52 00 appel 0xa4; 0xa4 <main> 78: 0c 94 61 00 jmp 0xc2; 0xc2 <_exit> ... 000000a4 <main>: a4: 80 e2 ldi r24, 0x20; 32 a6: 84 b9 sur 0x04, r24; 4 a8: f8 94 cli aa: 8f ef ldi r24, 0xFF; 255 ac: 87 bd en sortie 0x27, r24; 39 ae: 82 e0 ldi r24, 0x02; 2 b0: 80 93 6e 00 m 0x006E, r24 b4: 84 bd out 0x24, r24; 36 b6: 78 94 sei b8: 85 e0 ldi r24, 0x05; 5 ba: 85 bd sur 0x25, r24; 37 avant JC: 80 e0 ldi r24, 0x00; 0 être: 90 e0 ldi r25, 0x00; 0 c0: 08 95 ret000000c2 <_exit>: c2: f8 94 cli000000c4 <__stop_program>: c4: ff cf rjmp.-2; 0xc4 <__stop_program>  

Vous pouvez voir à l'adresse 0x74 qu'il appelle main, puis saute pour quitter. exit désactive les interruptions.

Lorsque les interruptions sont désactivées, votre ISR ne basculera pas la broche 13.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...