Avr studio, atmega32 - neodhalitelný problém ?

Bear John Grills bear.j.grills@gmail.com
Úterý Duben 14 21:16:35 CEST 2009


>> Vse jsem zkousel.. s tim asm("sbi ...") jeste ten den. Porad to delalo 
>> to same. Na osciloskopu jsem meril, ihned jak to neslo, nic. 
>>     
>
> Co je to "nic"? Tmava obrazovka?
>
> Co tak skusit popisat problem ako inzinier? Vacsina z nas nie su jasnovidci.
>
>   
Signal pro rozsviceni segmentovky napojen pres rezistor na bazi 
tranzistoru "lital" na log.1 pouze na tom pinu, ktery byl definovan jako 
prvni (int display_i =1;)
>> [...] vyzkousel jsem snad vsechno.
>>     
>
> To asi tazko...
>   
Uznavam ze vsechno opravdu ne :)
>> A ted tresnicka na zaver. Funguje to jak má, .. ale pouze pokud ten 
>> procik má na sobì 4,2V +-0,2V .. je to naprosto ¹ílené anomální chování.
>>     
>
> Co je to "ma na sobe"? Hovorite o napajacom napati?
> Ak ano, tak to poukazuje na hardwarovy problem - poobzeral by som sa po skratoch, bordeli v napajani, chybne pozapajane napajacie piny (vratane analogovych).
>   
Ano, hovorim o napajecim napeti. Odpuste spatny popis.
>> Migruji na AT91SAM7XC256. Zlatý Keil ... mam na to i ulink, vidím, co se 
>> tam deje, a ne, ze do atmegy nasypu cosi po SPI a neni do toho videt, i 
>> kdyz debugger rika, ze to jit ma, nejde to.
>>     
>
>
> Debugger je nastroj, a to jeden z N, a nie spasa.
>   
Omlouvam se za prehnana silna slova.

Pokračování tajuplného příběhu:
Sám sobě na "truc", jsem jel ke kamarádovi pro jiný smd atmega32. Tu 
původní, jsem vypájel, dal jsem tam tuto. A -- vše najednou bez 
problémů! Nedalo mi to, dal jsem tam ten původní.. a původní problém se 
znovu projevil.. Nevím, nedokážu si představit, že by nějaká hardwarová 
chyba, v IO, měla za důsledek takovéto chování.. podotýkám, že oba 
procesory byly nastaveny, včetně fuse bitů, naprosto autenticky. Že by 
byl problém v flash.. ponyprog vždy vše verifikoval ok.

Ted uz spis jentak pro zajimavost...

fusebity - zminuju ty co jsou nastaveny.
OCDEN, JTAGEN, CKOPT, BODLEVEL, BODEN.
Oscilator - external clock signal 8Mhz.

Zdrojovy kod..
Abych popsal HW,
k PD4 PD5 PD6 je pripojen 74HC164 ktery ridi led v segmentech
na PORTA dle konfigurace jsou rozsveceny jednotlive segmenty



#include "avr/io.h"
#include <avr/interrupt.h>
#include <stdio.h>

// posuvny registr pro data displeje 74HC164
#define display_data_port PORTD
#define display_data_ddr DDRD
#define display_data_shift_clock PD4
#define display_data_shift_reset PD5
#define display_data_shift_data PD6
// vyber segmentu k zobrazeni (segmenty jsou na pinu zapojeny vedle sebe)
// levy segment ma nejvyssi cislo
#define display_segment_port PORTA
#define display_segment_ddr DDRA
#define display_segment_offset 0 // offset na portu
#define display_segment_count 3 // pocet segmentu
#define display_segment_mask 0x7 // maska pro pocet segmentu (kolik 
segmentu tolik jednicek vedle sebe)

// fce pro konverzi cisla na hodnotu pro display podle tabulky
// pozn.. nektere cislice jsou spatne
int digit_conv(int digit) {
int result;
switch(digit)
{
case 0x1: // 1
result = 0x6;
break;
case 0x2: // 2
result = 0xF2;
break;
case 0x3: // 3
result = 0x4F;
break;
case 0x4: // 4
result = 0x33;
break;
case 0x5: // 5
result = 0x6D;
break;
case 0x6: // 6
result = 0x7D;
break;
case 0x7: // 7
result = 0x7;
break;
case 0x8: // 8
result = 0x7F;
break;
case 0x9: // 9
result = 0x6F;
break;
case 0x0: // 0
result = 0x3F;
break;
default: // other
result = 0;
break;

}
return result;
}

// fce ktera resetuje posuv. registr
void display_data_reset(void) {
display_data_port &=~ (1<<display_data_shift_reset); // reset 0
asm("nop");
display_data_port |= (1<<display_data_shift_reset); // reset 1
asm("nop");
}

// fce pro vystaveni dat na posuvnem registru
void display_data_bus_set(unsigned int data) {
int i;
int temp;

display_data_reset(); // reset

for(i=0;i<=7;i++) {
temp = (data >> i) & 0x1;
if(temp==0x1) {
display_data_port |= (1<<display_data_shift_data);
} else
{
display_data_port &=~(1<<display_data_shift_data);
}
asm("nop");
display_data_port |= (1<<display_data_shift_clock); // clock 1
asm("nop");
display_data_port &=~ (1<<display_data_shift_clock); // clock 0
asm("nop");
}
}

// promenne
volatile int display_segment_pointer = 1; // cislo ukazujici na vybranou 
segmentovku

// start programu
int main() {
// inicializace portu pro display
// konfigurace pro 74HC164
display_data_ddr |= 
(1<<display_data_shift_clock|1<<display_data_shift_reset|1<<display_data_shift_data); 
// vystup
display_data_port 
&=~(1<<display_data_shift_clock|1<<display_data_shift_reset|1<<display_data_shift_data); 
// vse na nulu pro jistotu
display_data_port |= (1<<display_data_shift_reset); // reset na jednicku 
(odresetovani)
// konfigurace portu pro vyber segmentu
display_segment_ddr |= (display_segment_mask<<display_segment_offset); 
// vystup
display_segment_port &=~(display_segment_mask<<display_segment_offset); 
// vse na nulu pro jistotu
// nastaveni timer0 jako overflow pro obnovovani displeje
TCNT0 = 0x00; // pocatecni hodnota timer counteru (pro jistotu)
TCCR0 |= 0x04; // prescaler
TIMSK |= 1<<TOV0; // TC0 overflow zapnuto
sei(); // globalni povoleni preruseni
// smycka
display_data_bus_set(digit_conv(5));
while(1) {
asm("nop");
asm("nop");
}
}

ISR(TIMER0_OVF_vect) // TC0 overflow
{

/** zoufalecky pokus
PORTA &=~(0x7);
if(display_i==0) {
PORTA = 0x1;
display_i = 1;
}
else if(display_i==1) {
PORTA = 0x2;
display_i = 2;
}
else if(display_i==2) {
PORTA = 0x4;
display_i = 0;
}

**/

// nejdrive se provede reset posuv. registru
display_data_reset();
display_data_bus_set(digit_conv(5)); // (5 - testovaci)
// dame nuly na vyber segmentu
display_segment_port &=~(display_segment_mask<<display_segment_offset);
asm("nop");
// 0x1 posuneme o aktualni cislo(pointer) vybraneho segmentu + offset
display_segment_port |= 
((0x1<<display_segment_pointer)<<display_segment_offset);
asm("nop");
display_segment_pointer++; // inkrementace segment pointeru
if(display_segment_pointer==display_segment_count) { // pokud se rovna 
poctu segmentu(resp. jsou znaceny od nuly, takze realny pocet segmentu 
je o jedno vyssi nez nejvyssi segment pointer), vynulovat
display_segment_pointer=0;
}

TCNT0=0x00;
}
*/








Další informace o konferenci Hw-list