Forum: Mikrocontroller und Digitale Elektronik Mega328p und RFM69 - Problem mit PCINT


von Elvis (Gast)


Lesenswert?

Tuten Gag,

ich möchte einen Atmega328p schlafen legen und diesen per PCINT 
(Tastendruck) wieder wecken. Das klappt soweit auch alles. Sobald ich 
jedoch die Funktion

radio.sendWithRetry();

aufrufe, reagiert der AVR nicht mehr auf einen PCINT. Hat hier jemand 
eine Idee zur Lösung des Problems?
1
/*////////////
2
// Includes //
3
////////////*/
4
5
#include <RFM69.h>
6
#include <SPI.h>
7
#include <avr/interrupt.h>
8
#include <avr/sleep.h>
9
10
/*//////////
11
// Config //
12
//////////*/
13
14
// radio param
15
#define RADIO_NETWORKID 0 // network id
16
#define RADIO_DEVICEID 1 // device id
17
#define RADIO_RECEIVERID 2 // receiver id
18
#define RADIO_FREQUENCY RF69_433MHZ // transmission frequency
19
#define RADIO_ENCRYPT true // use AES-encryption
20
#define RADIO_ENCRYPTIONKEY "TOPSECRETPASSWRD" // 16-byte key for all devices
21
#define RADIO_USEACK true // request ACKs
22
#define RADIO_SENDTIMEOUT 500 // timeout in ms
23
#define RADIO_STATUSLED 8 // pin for led
24
25
// buttons
26
#define BTN_UNFOLD 19
27
28
/*////////////////////
29
// Global Variables //
30
////////////////////*/
31
32
char Buffer[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
33
34
/*///////////
35
// Objects //
36
///////////*/
37
38
RFM69 Radio;
39
40
/*/////////
41
// Setup //
42
/////////*/
43
44
void setup()
45
{
46
  // for debugging
47
  Serial.begin(9600);
48
  
49
  // status-led
50
  pinMode(RADIO_STATUSLED, OUTPUT);
51
   
52
  // set button-pins
53
  pinMode(BTN_UNFOLD, INPUT_PULLUP);
54
55
  // enable pin-change-interrupts for port c
56
  PCICR |= (1 << PCIE1);
57
58
  // enable pin-change-interrupts on port c for specified pins
59
  PCMSK1 |= (1 << PCINT13);
60
61
  // start interrupts
62
  sei();
63
64
  // initialize RFM69
65
  Radio.initialize(RADIO_FREQUENCY, RADIO_DEVICEID, RADIO_NETWORKID);
66
  Radio.setHighPower();
67
  Radio.encrypt(RADIO_ENCRYPTIONKEY);
68
  Radio.sleep();
69
}
70
71
/*////////////
72
// Mainloop //
73
////////////*/
74
75
void loop()
76
{  
77
78
  digitalWrite(RADIO_STATUSLED, HIGH);
79
  delay(100);
80
  //Radio.sendWithRetry(RADIO_RECEIVERID, Buffer, sizeof(Buffer));
81
  Radio.sleep();
82
  digitalWrite(RADIO_STATUSLED, LOW);
83
  delay(100);
84
85
  // zzzz
86
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  
87
  sleep_mode(); 
88
}
89
90
/*///////
91
// ISR //
92
///////*/
93
94
ISR(PCINT1_vect)
95
{
96
}

von Elvis (Gast)


Lesenswert?

Soo,

habe jetzt mittels Radio.setPowerLevel() die Sendeleistung reduziert. 
Danach funktioniert der PCINT. Kann mir jemand den Effekt erklären?

von Christian S. (roehrenvorheizer)


Lesenswert?

" Sobald ich jedoch die Funktion radio.sendWithRetry();"



Woher sollte man wissen, was dieses Unterprogramm eigentlich genau 
macht?
OK, es hat etwas mit Senden zu tun und mit Wiederholungen...
mfG

von Stefan F. (Gast)


Lesenswert?

Neben dem Quelltest der "bösen" Methode wäre sicher auch ein Schaltplan 
hilfreich.

Ein häufiger Fehler sind zu große Pull-Up Widerstände in der Nähe von 
Antennen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.