Hi, ich möchte ein HUB75 64x32 Display mit 1/16Scan per STM32 ansteuern. Dazu habe ich folgende funktion geschrieben um zu verstehen wie das Display funktioniert. Leider habe ich das Problem das Zeile 16 und 32 deutlich heller sind als der Rest des Displays. Die write_display Funktion wird durch einen Timer immer im gleichen Takt aufgerufen. Was ist die besonderheit dieser Displays, oder was habe ich im Punkt HUB75 ansteuern falsch gemacht? Was könnte dazu führen, dass die Zeilen (die jeweils mit A,B,c und D Low angesteuert werden) ca. doppelt so hell sind? void write_display() { //display[63][31]=0xFF; //display[32][16]=0x0F; //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_SET); //PORTC |= (1<<OE); for(uint8_t line=0;line<=15;line++) { //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_SET); //PORTC |= (1<<OE); for(uint8_t pos = 128; pos>=1; pos--) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET); //PORTC &= ~(1<<PC4); //Clock Low //UntereDisplayhälfte schreiben //Line R1 if(display[line+16][pos-1] & 0x01) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET); //Line G1 if(display[line+16][pos-1] & 0x02) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET); //Line B1 if(display[line+16][pos-1] & 0x04) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET); //Obere Displayhälfte schreiben //Line R2 if(display[line][pos-1] & 0x01) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET); //Line B2 if(display[line][pos-1] & 0x02) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET); //Line G2 if(display[line][pos-1] & 0x04) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_RESET); //PORTC |= (1<<PC4); //Clock high //HAL_Delay(1); } HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_SET); //PORTC |= (1<<OE); switch(line) { case 15: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 14: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 13: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 12: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 11: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 10: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 9: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 8: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); break; case 7: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; case 6: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; case 5: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; case 4: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; case 3: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; case 2: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; case 1: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; case 0: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); break; default: break; } //for(uint16_t i=0;i<1250;i++){} //Ein"latchen" Strobe der Reihe //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_0, GPIO_PIN_RESET);//PORTC &= ~(1<<PC5); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_0, GPIO_PIN_SET); //PORTC |= (1<<PC5); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_0, GPIO_PIN_RESET);//PORTC &= ~(1<<PC5); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_RESET); //OE } //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_RESET); //OE }
Hier mal ein Bild von meinem Problemfall
Ohne deinen Code genauer angeschaut zu haben sieht das aus, als würdest du die Zeile mehrfach ansteuern, oder, du hast ein Problem mit deinem Timing.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
