Forum: Mikrocontroller und Digitale Elektronik Atmega16 steuert nicht alle Pins an


von Daniel S. (z-irgendwas)


Lesenswert?

Hallo,
Ich habe mit einem Atmega16 eine kleine Schaltung zusammengebastelt, 
welche auch eine Multiplex-/Segment Anzeige beinhaltet.

Leider steuert mir der Amtega 2 Ports nicht an. Da ich den Atmega auch 
schon ausgetauscht habe, denke ich, dass es ein Softwarefehler ist.
PC2 und PC3 werden leider nicht angesteuert PC0 und PC1 funktionieren 
jedoch einwandfrei.

Hier mal der Code:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main (void);
5
6
void delay_ms(uint16_t ms)
7
{
8
  for(uint16_t t=0; t<=ms ; t++)
9
  {
10
    _delay_ms(1);
11
  }
12
}
13
14
const int8_t numbers[1] =
15
{
16
    0b000000000,
17
};
18
19
void digit (uint8_t wert, uint8_t pin)
20
{
21
  PORTC |= (1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC3);
22
23
  PORTB = numbers[wert];
24
  PORTC &= ~(1 << pin);
25
  delay_ms(100);
26
}
27
28
int main()
29
{
30
  DDRB = 0xFF;
31
  DDRC |= (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3);
32
  PORTC |= (1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC3);
33
34
  while(1)
35
  {
36
    digit(1, PC0);
37
    digit(1, PC1);
38
    digit(1, PC2);
39
    digit(1, PC3);
40
  }
41
  return 0;
42
}

Hoffe ihr könnt mir helfen, Daniel

von Thomas (kosmos)


Lesenswert?

DAS JTAG-Interface befindet sich auf Port C, kann man per Software 
ausschalten, siehe Datenblatt

von 2ter Gast (Gast)


Lesenswert?

Beschreib mal in Prosa, was auf den Ports geschehen soll. Dann könnte 
man etwas zu deinem Quellkode sagen...

von 2ter Gast (Gast)


Lesenswert?

Ja Thomas hat recht...

von Daniel S. (z-irgendwas)


Lesenswert?

Erst mal vielen Dank, dass scheint die Lösung für mein Problem zu sein. 
Weiß jemand, wie ich mit Avr8 Burn-O-Mat, in den Fuses JTAG deaktivieren 
kann? Ich hab den Modus auf Expert gesetzt jedoch kommt(wenn ich 
probiere JTAG zu deaktivieren) beim schreiben eine Fehlermeldung(first 
Missmatch at Point 0x0000).

Mfg Daniel

von spess53 (Gast)


Lesenswert?

Hi

Dann disable JTAG per Software -> Datenblatt S.231->Bit 7 – JTD: JTAG 
Interface Disable.

MfG Spess

von Konrad S. (maybee)


Lesenswert?

Daniel Stein schrieb:
> const int8_t numbers[1] =
> {
>     0b000000000,
> };
>
> void digit (uint8_t wert, uint8_t pin)
> {
...
>   PORTB = numbers[wert];
...
> }
>
> int main()
> {
...
>     digit(1, PC0);

Also
  PORTB = numbers[1];
Hmm, ... da ist aber nichts!

von Thomas (kosmos)


Lesenswert?

nach Möglichkeit würde ich diese Pins gar nicht verwenden, dann hast du 
später noch die Möglichkeit per JTAG zu debuggen. Außerdem brauchst du 
kein Risiko eingehen etwas zu verfusen.

Am Programmstart würde ich eine Wartezeit von einigen Sekunden 
programmieren, wenn an einem Bestimmten Pin ein Signal anliegt bleibt 
JTAG an, wenn nicht wird JTAG ausgeschaltet.

von Daniel S. (z-irgendwas)


Lesenswert?

Wäre nett, wenn jemand einen passenden Codeschnipsel(in C) für mich 
hätte.

Mfg Daniel

von spess53 (Gast)


Lesenswert?

Hi

>Wäre nett, wenn jemand einen passenden Codeschnipsel(in C) für mich
>hätte.

Was verstehst du an dem Satz:

The application
software must write this bit to the desired value twice within four 
cycles to change its value

nicht? Wenn du das nicht allein schaffst, hast du das falsche Hobby.

MfG Spess

von Daniel S. (z-irgendwas)


Lesenswert?

Falls es noch jemanden interessiert, wie man JTAG per C deaktiviert:
1
MCUCSR = (1<<JTD);
2
MCUCSR = (1<<JTD);

Vielen Dank nochmal, ihr habt mich gerettet!!!

Mfg Daniel

von Karl H. (kbuchegg)


Lesenswert?

Daniel Stein schrieb:
> Wäre nett, wenn jemand einen passenden Codeschnipsel(in C) für mich
> hätte.
>

Wofür?
Für das Löschen der JTAGEN Fuse?

Die sind nicht im C-Code.
Da musst du dein Brennprogramm durchforsten, wie und wo man da die Fuses 
vom µC lesen kann. Dann stellst du die JTAGEN Fuse um und brennst die 
Fuses wieder in den µC.
Das hat erst mal nichts damit zu tun, wie man ein Programm auf den µC 
brennt. Das ist sozusagen der Mechanismus, mit dem man den µC an sich 
konfiguriert. Und es ist sehr enmpfehlenswert, wenn du weißt wie das in 
deinem Brennprogramm funktioniert, denn zum Umstellen der µC 
Taktfrequenz wirst du dieses Wissen ebenfalls benötigen. Daher bringt es 
auch nichts, wenn du die JTAGEN Fuse per Programm abstellst (was 
tatsächlich möglich wäre).

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.