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