Forum: Mikrocontroller und Digitale Elektronik Attiny 861 - nach reset anderes verhalten


von Holger M. (holger78)


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

: Bearbeitet durch Moderator
von Veit D. (devil-elec)


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
}

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> PORTC.DIR = 0b0000;
Das ist miese Syntax, auch wenn es in dem Fall nicht stört weil sowieso 
'ne Null draus wird, aber entweder schreibe alle Bits hin oder einfach 
0.

von foobar (Gast)


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)

von Holger M. (holger78)


Lesenswert?

Vielen, vielen Dank!!!
Damit habt ihr mir sehr geholfen.
Die ganzen Tipps für die Syntax und vor allem der Hinweis, das der 
Attiny861 kein Port C hat. Oh man... das ist mir peinlich!
Nochmals Danke.
Gruß Holgus

von Peter D. (peda)


Lesenswert?

Holger M. schrieb:
> #define F_CPU 3333333

Wo kommen denn die 3,3MHz her?
Der Attiny861 läuft ab Werk mit 1MHz.

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.