Sitter o leker med charlieplexing. Har en AVR processor(Mega 16) och jag charlie plexar lite på port D.
Jag har två sjusegments displayer med gemensam katod som är mina labbobjekt.
Hursom helst jag får "spöken"(dvs det lyser svagt) på sju segmentaren som ska vara släckt. Kopplat enligt såhär.
AVRPINNE 0...7
Sjusegment 1: katod GFABDEC
Sjusegment 2 C katord GFABDE
Den märkliga ordningen kommer sig ur pinouten för sjusegmentarna. Detta är ordningen från väster till höger upp o ner, men det spelar ju ingen roll.
Sjusegmentarna drivs med en bc547 enligt bild (snygg bild va? =) )

R1 är 1k
R2 är 680
Koden såhär.
Kod: Markera allt
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
#define BCDPORT PORTD
#define BCDDDR DDRD
uint8_t bcd[]={ 0x7E,
0x48,
0x3D,
0x4B,
0x67,
0x77,
0x4C,
0x7F,
0x4F,
0x5F,
0x73,
0x36,
0x79,
0x37,
0x17};
int main(void){
uint8_t volatile i=0;
while(1){
BCDDDR = (0x01 << i) ; // Första segmentet sitter med katoden på BCDPORT.0
BCDPORT = (0x01 << i) | ~(bcd[i+1] << i+1); // kör pullup på lämpliga pinnar
i++;
_delay_ms(1000);
BCDDDR=(0x01 << i); // andra segmentet sitter med katoden på BCDPORT.1
BCDPORT=(0x01 << i) | ~(bcd[i+1] << i+1);
_delay_ms(1000);
i++;
if(i==2)
i=0;
}
}
Tanken är.
För varje display
sätt katod pinnen låg(DVS utgång o hög i mitt fall, gör ju att potentialen hos transistorns kollektor blir rätt låg, ca 0,7 Volt)
Sättpullupp på de segment som ska vara tända så att transistorn är helt avstängd.
Missar jag något? (Det känns som en retorisk fråga eftersom det inte funkar =) )
mvh
Anders