Attiny 861 - nach reset anderes verhalten

OP #6260809
Lesenswert?

Hallo liebes Forum,

ich habe einen Attiny 861 und programmiere diesen mit dem neusten MPLAP 
XC8.

Recht schnell konnte ich erfolge erzielen und der Code wuchs.
Nach einiger zeit musste ich jedoch feststellen das, wenn ich ein 
Reset(Power cycle) machte, meine PCB mit dem µC nicht das machte was sie 
machen sollte. Nach neu Programmieren mit dem ICD3 über UPDI war das 
Verhalten wieder wie gewünscht ohne Fehler.

Ausfindig konnte ich den PORT C machen der nicht mehr die Eingänge 
erkennt.

Mein Code ist folgender:
1
#define F_CPU 3333333
2
#include <xc.h>
3
#include <util/delay.h>
4

5
#define LED 0x04        //PA2 - Ausgang - LED 
6
#define TA  0x7         //PC3 - Eingang - Taster
7

8
#define LED_ON          PORTA.OUT &= ~LED       // Schematisch D1 = EIN
9
#define LED_OFF         PORTA.OUT |= LED        // Schematisch D1 = AUS
10
#define TASTER          !(PORTC.IN & ~TA)       // Schematisch SW1, Sensor meldet ob Roboter auf Position steht
11

12
int main(void)
13
{
14
    _delay_ms(1000);
15
    // PORT 
16
    PORTA.DIR = 0b10000100;
17
    PORTC.DIR = 0b0000;
18
    // PULL UP 
19
    PORTC.PIN3CTRL = PORT_PULLUPEN_bm;  // PC3 = Taster
20
    
21
    LED_ON;
22
    _delay_ms(1000);
23
    LED_OFF;
24
    
25
    while(1)
26
    {
27
     if(TASTER) LED_ON;
28
     else LED_OFF;
29
     _delay_ms(500);
30
    }
31
}
Mein Weg ist folgender:
1. power
2. make and program aus MPLAB
3. RESULTAT:
LED leuchtet 1 Sekunde, danach kann ich mit dem Taster die LED schalten
->Funktion OK
4. power cycle (ob mit oder ohne ICD3 spiel keine Rolle)
5. Resultat:
LED leuchtet 1 Sekunde. Danach kann der Taster nicht mehr ausgewertet 
werden LED leuchtet nicht mehr.

Was mache ich falsch? Wie kann ich das beheben?
Ich freue mich auf eure Antworten
Gruß Holgus
#6260882
Lesenswert?

Hallo,

das define kommt mir komisch vor zusammen mit der if Abfrage.
1
#define TASTER          !(PORTC.IN & ~TA)

Zum Pin schalten/toggeln würde ich auch die vordefinierten "Namen" aus 
dem Headerfile verwenden.
Bsp.
1
PORTF.OUTTGL = PIN2_bm;

Statt binär würde ich auch die vordefinierten Bitmasken verwenden.
1
PORTF.DIR |= PIN2_bm;

Du kannst dir auch wiederverwendbare Funktionen bauen statt defines. Das 
mit den defines würde ich mir erst gar nicht so angewöhnen. Man kommt 
schwer wieder davon los und muss dann für alles defines schreiben ob man 
will oder nicht.
1
static inline bool PORTF_get_pin_level(const uint8_t pin)
2
{
3
  return VPORTF.IN & (1 << pin);
4
}
das wird von ... verwendet
1
static inline bool SW0_get_level()
2
{
3
  return PORTF_get_pin_level(6);
4
}
dann rufste nur noch das auf - Bsp.
1
if ( !SW0_get_level() )
2
{
3
  LED0_set_level(false);
4
}

Die Pinkodierung musste ja nicht hart kodieren, kannste variabel 
gestalten.

Noch was vordefiniertes aus dem Headerfile - zum abschauen.  :-)
1
static inline void PORTF_set_pin_level(const uint8_t pin, const bool level)
2
{
3
  if (level == true) {
4
    VPORTF.OUT |= (1 << pin);
5
  } else {
6
    VPORTF.OUT &= ~(1 << pin);
7
  }
8
}
Gast #6260922
Lesenswert?

> Ausfindig konnte ich den PORT C machen der nicht mehr die Eingänge
> erkennt.

Wundert mich jetzt nicht, laut Datenblatt hat der Attiny861 ja gar 
keinen Port C.

Wie auch immer:
1
#define TA  0x7         //PC3 - Eingang - Taster
2
#define TASTER          !(PORTC.IN & ~TA)       // Schematisch SW1,
Das Makro TASTER liefert true, wenn Bits 3-7 von PORTC.IN alle 0 sind. 
Sicher, dass du das willst?!?  Oder meintest du nicht eher:
1
#define TA      0x08    //PC3 is SW1
2
#define TASTER  ((PORTC.IN & TA)==0)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren